我有以下型號及形式:如何才能在ModelForm中顯示ForeignKey,而不是使其可編輯?
#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創建一個formset:
#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 select標籤。然而,我甚至不想在那裏展示所有的選擇。我只想顯示相應實例的關鍵字。我可以禁用選擇標記:
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'創建時預定義了用戶,還是從中獲取請求? – zymud
嘗試只讀= '只讀' 看到這一點:http://stackoverflow.com/questions/16109358/what-is-the-correct-readonly-attribute-syntax-for-input-text-elements –
用戶是在模型中預定義 – user3917718