【发布时间】:2015-08-12 07:08:43
【问题描述】:
我有以下模型和表格:
#models.py
class NetworkDevice(models.Model):
user = models.ForeignKey(User)
device_name = models.CharField(_('device name'), max_length=100)
...
#forms.py
class NetworkDevicesForm(ModelForm):
class Meta:
model = NetworkDevice
fields=('user', 'device_name',...)
'...' 是我忽略的一些字段,因为它们对此并不重要。我想根据我的 ModelForm 创建一个表单集:
#views.py
in some view:
network_device_formset = modelformset_factory(models.NetworkDevice,
extra=0, form=NetworkDevicesForm, fields=(
'user', 'device_name', ...))
我在我的模板中这样显示它:
<form action="{% url 'some:action' %}" method="post">
{% csrf_token %}
{{ devices_formset.management_form }}
<table>
{% for form in devices_formset %}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th>{{ field.label }}</th>
{% endfor %}
</tr>
</thead>
{% endif %}
{% endfor %}
<tbody>
{% for form in devices_formset %}
<tr>
{% for field in form %}
<td>{{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" value='{% trans "Save" %}'/>
</form>
现在这将显示我的 ForeignKey 和一个 HTML 选择标记。然而,我什至不想在那里展示所有的选择。我只想显示相应实例的密钥。我可以禁用选择标签:
class NetworkDevicesForm(ModelForm):
class Meta:
model = NetworkDevice
fields=('user', 'device_name', ...more fields)
widgets = {'user': widgets.Select(attrs={'readonly': True,
'disabled': True})}
但是我在验证用户字段时遇到错误。我想我可以以某种方式覆盖对此的验证。但这仍然会在生成的 html 中显示外键的所有选项。有没有办法我可以在我的模板中显示值而不在 ModelForm 中指定它,因为我不想编辑它。一些魔法,例如:
<tbody>
{% for form in devices_formset %}
<tr>
<td>{{ form.user }}</td>
{% for field in form %}
<td>{{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
除了 {{ form.user }} 不起作用。我可以在模板中以某种方式访问它吗?希望我很清楚我想做什么,这是可能的。
【问题讨论】:
-
用户是在创建
NetworkDevice时预定义的,还是您从中获取或请求? -
试试 readonly='readonly' 看到这个:stackoverflow.com/questions/16109358/…
-
模型中预定义了用户
标签: python django modelform formset