【问题标题】:Dynamically remove an exclusion on a field in a django model form动态删除 django 模型表单中字段的排除项
【发布时间】:2011-02-28 19:14:15
【问题描述】:

我想以编程方式启用默认排除的字段...

型号:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    an_excluded_field = models.TextField()
    my_bool = models.BooleanField(default=False) # this is the field to conditionally enable...

表格:

class MyModelForm(ModelForm):
    class Meta:
        model = EmailTemplate
        excludes = ('an_excluded_field', 'my_bool')

我想做这样的事情(或类似的事情......):

form = MyModelForm(enable_my_bool=True)

这几乎就像这篇文章(我希望默认排除该字段): How can I exclude a declared field in ModelForm in form's subclass?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    1) 您可以定义表单的第二个版本:

    class MyExcludedModelForm(MyModelForm):
        class Meta:
            excludes = ('my_bool',) # or could use fields in similar manner
    

    2) 您可以覆盖表单的构造函数:
    (与您参考的其他 SO 帖子中的描述相同)

    class MyModelForm(ModelForm):
        def __init__(self, *args, **kwargs):
            if not kwargs.get('enable_my_bool', false):
                self.fields.pop('my_bool')
            super(MyModelForm, self).__init__(*args, **kwargs) # maybe move up two lines? (see SO comments)
    

    【讨论】:

    • 最终使用解决方案 1... 对这个解决方案并不完全满意,因为它违反了 DRY,但它有效...
    • 在摆弄self.fields之前需要调用超类的构造函数。
    【解决方案2】:

    如果你覆盖了构造函数,那么你需要在调用超类构造函数(如 mgalgs)之前 pop 来自 kwargs 的值提及:

    def __init__(self, *args, **kwargs):
        enable_my_bool = kwargs.pop('enable_my_bool', True) # True is the default
        super(MyModelForm, self).__init__(*args, **kwargs)
        if not enable_my_bool:
            self.fields.pop('my_bool')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2023-04-09
      • 2019-04-19
      相关资源
      最近更新 更多