如何在 Django 表单中使用外键自动填充变量?
How to autofill variable with foreign key in django form?
简而言之:我想自动填充表单的外部变量:
TL;DR
这是项目 link。
我有一个模型:
from django.db import models
from django.urls import reverse
# Create your models here.
class School(models.Model):
name = models.CharField(max_length=256)
principal = models.CharField(max_length=256)
location = models.CharField(max_length=256)
def __str__(self): return self.name
def get_absolute_url(self):
return reverse('basic:detail', kwargs={'pk': self.pk})
class Student(models.Model):
name = models.CharField(max_length=256)
age = models.PositiveIntegerField()
school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='students')
def __str__(self): return self.name
def get_absolute_url(self):
return reverse('basic:detail', kwargs={'pk': self.school.pk})
和url.py:
urlpatterns = [
path('', views.Index.as_view(), name='index'),
path('list/', views.SchoolListView.as_view(), name='list'),
path('<int:pk>/', views.SchoolDetailView.as_view(), name='detail'),
path('create/', views.SchoolCreateView.as_view(), name='create'),
path('update/<int:pk>/', views.SchoolUpdateView.as_view(), name='update'),
path('delete/<int:pk>/', views.SchoolDeleteView.as_view(), name='delete'),
path('student/create/', views.StudentCreateView.as_view(), name='creates'),
path('student/create/<int:pk>', views.StudentCreateView.as_view(), name='createspk'),
path('student/update/<int:pk>/', views.StudentUpdateView.as_view(), name='updates'),
path('student/delete/<int:pk>/', views.StudentDeleteView.as_view(), name='deletes'),
]
我正在使用 CBV:
class StudentCreateView(CreateView):
try:
print("*******")
print(pk)
except:
pass
model = Student
fields = ["name", "age", 'school']
我添加了一个 link 来创建学生在校详细信息,如下所示:
当我点击 create new with pk 时,我正在通过 School 的 pk 然后我去:
如您所见,“学校”字段是下拉列表,未选择任何内容,我想将学校的默认值设置为调用它的学校,在本例中 xavier school for gifted childrens 。
我的创建学生代码是:
{% extends "basic/base.html" %}
{% block content %}
<h1>
{% if not form.instance.pk %}
Create Student:
{% else %}
Update Student:
{% endif %}
</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" class="btn btn-primary">
</form>
{% endblock content %}
我该怎么做?提前致谢。
尝试像这样修改您的视图:
class StudentCreateView(CreateView):
try:
print("*******")
print(pk)
except:
pass
model = Student
fields = ["name", "age", 'school']
def get_initial(self):
initial = super(StudentCreateView, self).get_initial()
initial['school'] = School.objects.get(pk=self.kwargs['pk'])
return initial
我还建议将 url 中的参数(以及 get_initial
方法中的参数)重命名为 school_pk
之类的名称,以表明您没有传递pk
为要创建的 Student
。
简而言之:我想自动填充表单的外部变量:
TL;DR
这是项目 link。
我有一个模型:
from django.db import models
from django.urls import reverse
# Create your models here.
class School(models.Model):
name = models.CharField(max_length=256)
principal = models.CharField(max_length=256)
location = models.CharField(max_length=256)
def __str__(self): return self.name
def get_absolute_url(self):
return reverse('basic:detail', kwargs={'pk': self.pk})
class Student(models.Model):
name = models.CharField(max_length=256)
age = models.PositiveIntegerField()
school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='students')
def __str__(self): return self.name
def get_absolute_url(self):
return reverse('basic:detail', kwargs={'pk': self.school.pk})
和url.py:
urlpatterns = [
path('', views.Index.as_view(), name='index'),
path('list/', views.SchoolListView.as_view(), name='list'),
path('<int:pk>/', views.SchoolDetailView.as_view(), name='detail'),
path('create/', views.SchoolCreateView.as_view(), name='create'),
path('update/<int:pk>/', views.SchoolUpdateView.as_view(), name='update'),
path('delete/<int:pk>/', views.SchoolDeleteView.as_view(), name='delete'),
path('student/create/', views.StudentCreateView.as_view(), name='creates'),
path('student/create/<int:pk>', views.StudentCreateView.as_view(), name='createspk'),
path('student/update/<int:pk>/', views.StudentUpdateView.as_view(), name='updates'),
path('student/delete/<int:pk>/', views.StudentDeleteView.as_view(), name='deletes'),
]
我正在使用 CBV:
class StudentCreateView(CreateView):
try:
print("*******")
print(pk)
except:
pass
model = Student
fields = ["name", "age", 'school']
我添加了一个 link 来创建学生在校详细信息,如下所示:
当我点击 create new with pk 时,我正在通过 School 的 pk 然后我去:
如您所见,“学校”字段是下拉列表,未选择任何内容,我想将学校的默认值设置为调用它的学校,在本例中 xavier school for gifted childrens 。
我的创建学生代码是:
{% extends "basic/base.html" %}
{% block content %}
<h1>
{% if not form.instance.pk %}
Create Student:
{% else %}
Update Student:
{% endif %}
</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" class="btn btn-primary">
</form>
{% endblock content %}
我该怎么做?提前致谢。
尝试像这样修改您的视图:
class StudentCreateView(CreateView):
try:
print("*******")
print(pk)
except:
pass
model = Student
fields = ["name", "age", 'school']
def get_initial(self):
initial = super(StudentCreateView, self).get_initial()
initial['school'] = School.objects.get(pk=self.kwargs['pk'])
return initial
我还建议将 url 中的参数(以及 get_initial
方法中的参数)重命名为 school_pk
之类的名称,以表明您没有传递pk
为要创建的 Student
。