【问题标题】:Dynamically excluding field from Django ModelForm从 Django ModelForm 中动态排除字段
【发布时间】:2018-11-08 07:38:43
【问题描述】:

我想以编程方式排除表单中的一个字段。 目前我有这个:

class RandomForm(BaseForm):
    def __init__(self, *args, **kwargs):

        # This doesn't work
        if kwargs["instance"] is None:
            self._meta.exclude = ("active",)

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

        # This doesn't work either
        if kwargs["instance"] is None:
            self._meta.exclude = ("active",)

    class Meta:
        model = models.Service
        fields = (...some fields...)

如何仅在创建新模型时排除 active 字段?

【问题讨论】:

  • 只是澄清一下:不工作意味着即使self._meta.exclude = ("active",) 行被执行,该字段仍然在表单中出现?还是您遇到错误?
  • 这只是一个错字还是RandomForm真的从ServiceForm调用了超级方法?
  • @Ralf 确实。 “不起作用”意味着该字段不断显示。另外,是的,这是一个错字。

标签: python django python-3.x django-2.0


【解决方案1】:

你可以这样解决:

class RandomForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(RandomForm, self).__init__(*args, **kwargs)
        if not self.instance:
            self.fields.pop('active')

    class Meta:
        model = models.Service
        fields = (...some fields...)

【讨论】:

  • 这将覆盖我模型中的verbose_name、默认值等。
  • @alexandernst 我没有机会测试它,但试试if not self.instance: self.fields.pop('active')。您还应该将active 添加到元的字段中。
【解决方案2】:

Django ModelForm 提供exclude 属性。你试过吗?

class RandomForm(ModelForm):

    class Meta:
        model = models.Service
        exclude = ['is_active']

【讨论】:

  • 没有 dv 但我认为 OP 意味着“动态地”取决于某些属性(例如实例是否已经存在),表单应该以不同的方式呈现,所以我们可以 重用 相同的表单,但会显示不同的字段。
猜你喜欢
  • 2011-01-31
  • 2011-08-08
  • 1970-01-01
  • 2011-08-26
  • 2023-03-09
  • 2014-06-20
  • 2013-07-18
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多