代码之家  ›  专栏  ›  技术社区  ›  Robus

Django窗体不显示特定输入

  •  4
  • Robus  · 技术社区  · 14 年前

    我有一个这样的模型:

    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),我如何使表单中的字段隐藏?

    2 回复  |  直到 14 年前
        1
  •  2
  •   ars    14 年前

    您可以覆盖 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
  •  1
  •   Gabriel Hurley    14 年前

    似乎通过使用从舰队到舰艇的manytomanyfield,或从舰艇到船型的foreignkey,然后简单地使用 ModelMultipleChoiceField 以你的形式…但也许有件事我不明白。

    不管怎样,多回音场可能比这组积分场要好。这基本上就是多回声场的作用。