【问题标题】:Create dynamic labels for a field in a formset为表单集中的字段创建动态标签
【发布时间】:2012-09-10 03:25:46
【问题描述】:

我的表格如下

class InstructorCourseCertificationForm(forms.Form):
    Course = forms.BooleanField()
    SubjectExpert = forms.BooleanField(label='Subject Expert')

我需要创建一个表单集,并根据我拥有的课程列表动态设置课程字段的标签。

【问题讨论】:

    标签: django django-forms formsets


    【解决方案1】:

    根据我需要动态字段的经验,我通常最终将数据存储在数据库中,然后根据数据库中的数据,生成动态表单。换句话说,我没有创建基于forms.Form 的类,我稍后会对其进行自定义,而是使用python 的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 模型的实例,然后创建一个证书表单出去。但无论哪种方式,想法都是相同的。

    但需要注意的是,此时您无法保证这些字段会按顺序排列。在这种情况下,您应该使用collections 中的OrderedDict 而不是dict ({}) 来定义字段。

    不确定这种方法与FormSets 的效果如何,但也许它可以给你一些想法。

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多