如何在Django Admin中隐藏HiddenInput小部件的字段标签?

18 投票
10 回答
22468 浏览
提问于 2025-04-15 14:14

我有一段Django表单的代码,长这样:

class GalleryAdminForm(forms.ModelForm):
    auto_id=False
    order = forms.CharField(widget=forms.HiddenInput())

这段代码可以让表单字段消失,但在Django的管理页面上,"Order"这个标签还是会显示。如果我使用:

order = forms.CharField(widget=forms.HiddenInput(), label='')

那我还是会看到字段和标签之间的":"符号。

我该怎么才能把整个东西都隐藏起来呢?

10 个回答

37

我真不敢相信居然有好几个人建议用jQuery来解决这个问题...

这是不是一种情况:当你只会用锤子的时候,所有东西看起来都像钉子?

拜托,如果你打算从客户端来处理这个问题(而不是在后端代码中解决根本问题),那么用CSS来做不是更合适吗?

如果你在管理后台,那确实有点难,但如果是在普通页面上,直接从表单模板中去掉整个标签就简单多了,比如说

如果你在管理后台,你仍然可以在你的GalleryAdminForm类中重写BaseForm的as_table、as_ul和as_p方法,以便在渲染时省略任何标签为空的字段(或者值可能是':'的字段)。

(...看一下forms.py的160-170行,似乎Django 1.2应该能正确省略空标签的':',所以我猜你用的是旧版本?)

43

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

使用自定义表单模板来控制隐藏字段会更干净,因为这样就不会把多余的信息发送给客户端。

-22

如果你在使用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'

你明白这个意思了吧...

撰写回答