【问题标题】:Django form don't show specific inputsDjango 表单不显示特定输入
【发布时间】:2010-07-23 00:36:15
【问题描述】:

说,我有一个这样的模型:

class Fleet(models.Model):
    user = models.ForeignKey(User)
    [...]
    ship1 = models.IntegerField(default=0)
    ship2 = models.IntegerField(default=0)
    ship3 = models.IntegerField(default=0)
    ship4 = models.IntegerField(default=0)

还有一个表格:

class sendFleet(forms.Form):
    [...]
    ship1 = forms.IntegerField(initial=0)
    ship2 = forms.IntegerField(initial=0)
    ship3 = forms.IntegerField(initial=0)
    ship4 = forms.IntegerField(initial=0)

如果用户没有可用的“船”(即舰队模型中的 = 0),我如何隐藏表单中的字段?

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    您可以覆盖表单中的visible_fields(或hidden_fields,如果您真的想要隐藏字段)方法,将它们标记为“不可见”(或隐藏输入)。详情请见docs

    编辑:这样的事情应该可以工作......

    class sendFleet(forms.Form):
        [...]
        ship1 = forms.IntegerField(initial=0)
        ship2 = forms.IntegerField(initial=0)
    
        def visible_fields(self):
            # create a list of fields you don't want to display
            invisibles = []
            if self.instance.ship1 == 0:
                invisibles.append(self.fields['ship1'])
    
            # remove fields from the list of visible fields
            visibles = super(MailForm, self).visible_fields()
            return [v for v in visibles if v.field not in invisibles]
    

    然后在你的模板中:

    {% for field in form.visible_fields %}
        {{ field.label_tag }} : {{ field }}
    {% endfor %}
    

    【讨论】:

    • 我可以问一个例子吗? :-)
    【解决方案2】:

    似乎可以通过使用从 Fleet 到 Ship 的 ManyToManyField 或从 Ship 到 Form 的 ForeignKey,然后在表单中简单地使用 ModelMultipleChoiceField 来更好地解决这个问题......但也许有些东西我不是理解。

    无论哪种方式,MultipleChoiceField 都可能比这组 IntegerFields 更好。这基本上就是 MultipleChoiceField 的用途。

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 1970-01-01
      • 2016-12-30
      • 2022-07-08
      • 2021-12-11
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多