我有一个表格如下
class InstructorCourseCertificationForm(forms.Form):
Course = forms.BooleanField()
SubjectExpert = forms.BooleanField(label='Subject Expert')
我需要创建一个表单集,并根据我拥有的课程列表动态设置课程字段的标签。
我有一个表格如下
class InstructorCourseCertificationForm(forms.Form):
Course = forms.BooleanField()
SubjectExpert = forms.BooleanField(label='Subject Expert')
我需要创建一个表单集,并根据我拥有的课程列表动态设置课程字段的标签。
根据我需要动态字段的经验,我通常最终将数据存储在数据库中,然后根据数据库中的数据,生成动态表单。换句话说,我不创建后来自定义的基于类,而是使用 python 的函数forms.Form
从头开始创建一个类。type
我认为这在一个例子中可能会更清楚。假设您有一个模型Course
,其中包含一个name
字段:
class Course(models.Model):
name = models.CharField(max_length=64)
因此,您可以通过向模型添加方法从头开始创建表单:
class Course(models.Model):
...
def certificate_form_class(self):
# assuming the name can only have spaces
# if not, then more normalizing has to be done
form_name = self.name.title().replace(' ', '')
bases = (forms.Form,)
fields = {
'Course': forms.BooleanField(label=self.name),
'SubjectExpert': forms.BooleanField(label='Subject Expert')
}
form_class = type(form_name, bases, fields)
return form_class
然后您可以按如下方式使用它:
course = Course.objects.get(...)
certificate_form_class = course.certificate_form_class()
certificate_form = certificate_form_class()
# use it as a regular form
有人可能会争辩说,此时您正在混合表单和模型,在这种情况下,您可以在其中创建一个辅助函数,forms.py
该函数将获取Course
模型的一个实例,然后从中创建一个证书表单。但无论哪种方式,这个想法都是相同的。
一个警告是,此时,您不能保证这些字段会按顺序排列。在这种情况下,您应该使用OrderedDict
fromcollections
而不是dict
( {}
) 来定义字段。
不确定这种方法的效果如何,FormSets
但也许它可以给你一些想法。