【问题标题】:Storing dynamic fields in Django forms在 Django 表单中存储动态字段
【发布时间】:2011-01-31 03:48:21
【问题描述】:

Django 的表单库具有表单集的功能,允许您处理动态添加的表单。例如,如果您的应用程序有一个书签列表,您可以使用表单集,您可以使用表单集来处理多个表单,每个表单代表一个书签。

如果您想动态地向表单添加字段,该怎么办?一个示例是调查创建页面,您可以在其中动态添加无限数量的问题。你如何在 Django 中处理这个问题?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    要在 Form 或 ModelForm 上添加、删除和更改字段,只需像这样覆盖 __init__():

    class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        other_stuff = kwargs.pop('stuff')
    
        super(MyForm, self).__init__(*args, **kwargs)
    
        self.fields['my_dynamic_field'] = forms.Field(...)
    
        # Add fields based on user or other_stuff
    

    并像这样使用它:form = MyForm(user = user, stuff = stuff)

    【讨论】:

    • 注意:我不能将用户 kwarg 发送到超级 init ; raise "__init__() 得到了一个意外的关键字参数 'user'"
    • 已解决:kwargs.pop 必须在 super call 之前出现
    【解决方案2】:

    看看最近由 Django 的创始人之一 Jacob Kaplan-Moss 撰写的帖子:"Dynamic form generation"。它使用一个示例逐步向您展示该过程。很好读。

    还有a 2008 article by James Bennett,Django 的发布经理。

    【讨论】:

      【解决方案3】:

      在 python 中,您可以动态地实例化一个类。 knutin 展示了一个基于动态自定义表单并添加一些字段的好示例。

      您也可以动态创建整个表单,取自example given by James Bennett:

      def make_contact_form(user):
          fields = { 'name': forms.CharField(max_length=50),
                 'email': forms.EmailField(),
                 'message': forms.CharField(widget=forms.Textarea) }
          if not user.is_authenticated():
          fields['captcha'] = CaptchaField()
          return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields })
      

      【讨论】:

        猜你喜欢
        • 2011-03-18
        • 2021-12-18
        • 1970-01-01
        • 2011-02-07
        • 2019-11-03
        • 2011-01-24
        • 2012-02-22
        • 2019-05-02
        • 2017-06-06
        相关资源
        最近更新 更多