如何在Django Admin中隐藏HiddenInput小部件的字段标签?
我有一段Django表单的代码,长这样:
class GalleryAdminForm(forms.ModelForm):
auto_id=False
order = forms.CharField(widget=forms.HiddenInput())
这段代码可以让表单字段消失,但在Django的管理页面上,"Order"这个标签还是会显示。如果我使用:
order = forms.CharField(widget=forms.HiddenInput(), label='')
那我还是会看到字段和标签之间的":"符号。
我该怎么才能把整个东西都隐藏起来呢?
10 个回答
我真不敢相信居然有好几个人建议用jQuery来解决这个问题...
这是不是一种情况:当你只会用锤子的时候,所有东西看起来都像钉子?
拜托,如果你打算从客户端来处理这个问题(而不是在后端代码中解决根本问题),那么用CSS来做不是更合适吗?
如果你在管理后台,那确实有点难,但如果是在普通页面上,直接从表单模板中去掉整个标签就简单多了,比如说。
如果你在管理后台,你仍然可以在你的GalleryAdminForm类中重写BaseForm的as_table、as_ul和as_p方法,以便在渲染时省略任何标签为空的字段(或者值可能是':'的字段)。
(...看一下forms.py的160-170行,似乎Django 1.2应该能正确省略空标签的':',所以我猜你用的是旧版本?)
Oraculum说得对。你不应该在客户端处理这些杂乱的东西。如果这些信息太乱,那就根本不应该发送给客户端。基于Oraculum的回答,你应该使用自定义的表单模板,因为你可能还是想在表单中保留一些隐藏的值。
{% for field in form.visible_fields %}
<div>
{{ field.errors }}
<span class="filter-label">{{ field.label_tag }}</span><br>
{{ field }}
</div>
{% endfor %}
{% for field in form.hidden_fields %}
<div style="display:none;">{{ field }}</div>
{% endfor %}
使用自定义表单模板来控制隐藏字段会更干净,因为这样就不会把多余的信息发送给客户端。
如果你在使用JQuery,这样做就可以了:
你的表单
TO_HIDE_ATTRS = {'class': 'hidden'}
class GalleryAdminForm(forms.ModelForm):
auto_id=False
order = forms.CharField(widget=forms.TextInput(attrs=TO_HIDE_ATTRS))
需要添加到你的模板中的Javascript代码
$(document).ready(function(){
$('tr:has(.hidden)').hide();
});
如果你是把表单以表格的形式展示,这样就能正常工作。如果你想让它适用于任何形式的表单展示,可以这样做:
$(document).ready(function(){
$('{{ form_field_container }}:has(.hidden)').hide();
});
然后在你的模板上下文中添加 form_field_container
。举个例子:
如果你这样展示你的表单:
<form>
<span>{{ field.label_tag }} {{ field }}</span>
</form>
你的上下文必须包含:
'form_field_container': 'span'
你明白这个意思了吧...