例如我有学生模型
class Student(models.Model):
first_name = models.CharField(max_lenght=100)
last_name = models.CharField(max_lenght=100)
learning_group = models.CharField(max_lenght=100)
所以我想为某个小组中的每个学生创建以下表格:
|学生|马克|缺席|
|约翰史密斯|输入标记|输入缺席时间|
感谢您的帮助。
编辑:
我在JSonField()中存储我的缺席和标记字段,它看起来像这样
{student_pk:1,标记:5,缺席:3}
那我做了什么:
起初我尝试通过覆盖forms.Form init 方法来实现它,但格式错误
def MarkBookForm(forms.Form):
def __init__(self, *args, **kwargs):
self.students = kwargs.pop('students', None)
super(MarkBookForm, self).__init__(*args, **kwargs)
for student in self.students:
self.fields["student_{}".format(student.pk)] = forms.CharField(initial="{} {}".format(student.first_name, student.last_name)
self.fields["mark_{}".format(student.pk)] = forms.FloatField()
self.fields["absent_{}".format(student.pk)] = forms.FloatField()
这就是我所做的
答案 0 :(得分:1)
首先,您应该为mark
和absent
定义模型
你可以像这样使用(未经测试:)):
models.py:
class MyModel(models.Model):
field1 = models.CharField(max_length=40, blank=False, null=False)
field2 = models.CharField(max_length=60, blank=True, null=True)
forms.py:
class FormForMyModel(forms.Form):
form_field1 = forms.CharField(max_length=40, required=True)
form_field2 = forms.CharField(max_length=60, required=False)
views.py:
def create_a_my_model(request):
if request.method == 'POST':
form = FormForMyModel(request.POST)
if form.is_valid():
my_model = MyModel()
my_model.field1 = form.cleaned_data.get('form_field1', 'default1')
my_model.field2 = form.cleaned_data.get('form_field2', 'default2')
my_model.save()
else:
form = FormForMyModel()
context_data = {'form': form}
return HttpResponse('templtate.html', context_data)
以上示例概述了通用表单工作流程。
您可以在上面的示例中发现两个烦人的问题:
MyModel
和FormForMyModel
上的字段定义字段。但是,这两个字段组(类型)之间存在很多相似之处,因此这是一种重复的工作。添加标签,验证器等时,相似性会增加。MyModel
实例有点傻,必须手动分配所有这些值。这是 ModelForm 的用武之地。
回到这两个问题:
我只是在model = MyModel
类中定义Meta
,而不是为每个模型字段定义表单字段。这指示表单从模型字段自动生成表单字段。
模型表单有save
方法可用。这可以用于在视图中的一行中创建模型实例,而不是手动分配逐个字段。
因此,让我们使用ModelForm
:
models.py:
class MyModel(models.Model):
field1 = models.CharField(max_length=40, blank=False, null=False)
field2 = models.CharField(max_length=60, blank=True, null=True)
forms.py:
class MyModelForm(forms.ModelForm): # extending ModelForm, not Form as before
class Meta:
model = MyModel
views.py:
def create_a_my_model(request):
if request.method == 'POST':
form = MyModelForm(request.POST)
if form.is_valid():
# save the model to database, directly from the form:
my_model = form.save() # reference to my_model is often not needed at all, a simple form.save() is ok
# alternatively:
# my_model = form.save(commit=False) # create model, but don't save to database
# my.model.something = whatever # if I need to do something before saving it
# my.model.save()
else:
form = MyModelForm()
context_data = {'form': form}
return HttpResponse('templtate.html', context_data)