Django表单不显示特定输入项
假设我有一个这样的模型:
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 %}