如何从表单构造函数动态更新Django Form Meta类字段?

Thi*_*Lam 17 django django-forms

我想Meta.fields动态更新.是否可以从Form构造函数中执行此操作?我尝试了以下但year在表单生成期间没有显示.只有nametitle显示.

class Author(models.Model):
    name = ...
    title = ...
    year = ...

class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title')

    def __init__(self, *args, **kwargs):
        self.Meta.fields += ('year',)
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 17

不,那不行.在您到达之前,Meta被 - 令人惊讶地 - 解析了元类__init__.

执行此操作的方法是手动将字段添加到self.fields:

def __init__(self, *args, **kwargs):
    super(PartialAuthorForm, self).__init__(*args, **kwargs)
    self.fields['year'] = forms.CharField(whatever)
Run Code Online (Sandbox Code Playgroud)


mko*_*nen 14

其他人的答案很棒(特别是@BranHandley's),但有时,最容易有条件地删除一些东西.显然,这不适用于动态创建的内容,但如果您只需要选择包含一个字段,那么请尝试这样做.

class MyModelForm(ModelForm):
  class Meta:
    model = MyModel
    fields = ['normalField', 'conditionalField', ]

  def __init__(self, *args, **kwargs):

    super(MyModelForm, self).__init__(*args, **kwargs)

    if condition is True:
      del self.fields['conditionalField']
Run Code Online (Sandbox Code Playgroud)

如上所述,以另一种方式进行操作可能相当复杂,但有条件地降低它是非常简单的.=)