Django表单不显示特定输入项

4 投票
2 回答
1959 浏览
提问于 2025-04-16 01:43

假设我有一个这样的模型:

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 个回答

1

看起来这个问题用Fleet到Ship的多对多关系(ManyToManyField)来解决会更好,或者用Ship到Form的外键(ForeignKey),然后在你的表单里简单地使用一个ModelMultipleChoiceField... 但也许我有些地方没理解清楚。

无论如何,使用一个多选字段(MultipleChoiceField)可能会比这组整数字段(IntegerFields)更合适。这基本上就是多选字段的用途。

2

你可以在表单中重写 visible_fields(或者如果你真的需要一个隐藏字段,可以重写 hidden_fields)的方法,把它们标记为“不可见”(或者隐藏输入)。想了解更多细节,可以查看 文档

编辑:像这样应该可以工作……

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 %}

撰写回答