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

时间:2009-09-11 04:15:16

标签: python django django-admin

我有一些看起来像这样的Django表单代码:

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

这使得表单字段消失了,但它在Django管理页面中留下了标签“Order”。如果我使用:

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

我仍然在字段和标签之间留下“:”。

如何隐藏整个事情?!

10 个答案:

答案 0 :(得分:38)

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

使用自定义表单模板来控制隐藏字段更加清晰,因为它不会向客户端发送无关信息。

答案 1 :(得分:36)

我无法相信有几个人建议使用jQuery ...

是否是这样的情况:当你知道的唯一工具是锤子时,一切看起来像钉子?

来吧,如果你打算从客户端做到这一点(而不是在后端代码中修复问题的根源),肯定正确的地方是CSS?

如果您在管理网站中,那么它有点难,但如果它是常规页面,那么很容易从表单模板for example

中省略整个标签

如果您在管理站点中,那么您仍然可以覆盖GalleryAdminForm类中的BaseForm的as_table,as_ul,as_p方法(请参阅django / forms / forms.py),以省略标签所在的任何字段的标签。空白(或==':',因为值可能处于渲染的这个阶段)

(...查看forms.py的第160-170行似乎Django 1.2应该正确省略':'如果标签是空白的,那么我猜你的版本是旧的?)

答案 2 :(得分:17)

尝试

{%for form in form.visible_fields%}

答案 3 :(得分:3)

我认为通过修改class AdminField(object)中的contrib/admin/helpers.py来实现HiddenInput小部件的“:”标签省略更为简单:

    if self.is_checkbox:
        classes.append(u'vCheckboxLabel')
        contents = force_unicode(escape(self.field.label))
    else:
        contents = force_unicode(escape(self.field.label)) + u':'

到:

    if self.is_checkbox:
        classes.append(u'vCheckboxLabel')
        contents = force_unicode(escape(self.field.label))
    else:            
        contents = force_unicode(escape(self.field.label))
        #MODIFIED 26/10/2009
        if self.field.label <> '':
           contents += u':'
        # END MODIFY

答案 4 :(得分:3)

Create a hidden field in the admin site检查答案,可以在没有JavaScript的情况下通过覆盖admin/includes/fieldset.html来完成。从那里,您可以注入一个CSS类,然后完成剩下的工作。

答案 5 :(得分:2)

理论上,您应该能够将label_suffix传递给表单构造函数。但是,Django管理员忽略了这一点。

你被Django中的两个错误所困扰:#18134 'BoundField.label_tag should include form.label_suffix'(固定在主干中,应该在1.6中),在较小程度上#11277 Hidden fields in Inlines are displayed as empty rows

目前,最佳解决方案是覆盖admin字段集模板。对您的小部件使用HiddenInput,然后覆盖管理字段集模板(documented here)。只需使用以下内容创建templates/admin/includes/fieldset.html

<fieldset class="module aligned {{ fieldset.classes }}">
    {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
    {% if fieldset.description %}
        <div class="description">{{ fieldset.description|safe }}</div>
    {% endif %}
    {% for line in fieldset %}
        <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
            {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
            {% for field in line %}
                <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}>
                    {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
                    {% if field.is_checkbox %}
                        {{ field.field }}{{ field.label_tag }}
                    {% else %}
                        {# only show the label for visible fields #}
                        {% if not field.field.is_hidden %}
                        {{ field.label_tag }}
                        {% endif %}

                        {% if field.is_readonly %}
                            <p>{{ field.contents }}</p>
                        {% else %}
                            {{ field.field }}
                        {% endif %}
                    {% endif %}
                    {% if field.field.help_text %}
                        <p class="help">{{ field.field.help_text|safe }}</p>
                    {% endif %}
                </div>
            {% endfor %}
        </div>
    {% endfor %}
</fieldset>

答案 6 :(得分:2)

根据Wilfried Hughes的解决方案,我改变了fieldset.html,但收效甚微。

下面的代码片段不仅隐藏了输入元素,如果fieldset只包含一个input-type设置为hidden的单个元素,它也隐藏了周围的div元素,在表单中没有空间。

<fieldset class="module aligned {{ fieldset.classes }}">
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
{% if fieldset.description %}
    <div class="description">{{ fieldset.description|safe }}</div>
{% endif %}
{% for line in fieldset %}
    <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}"{% if line.fields|length_is:'1' %}{% for field in line %}{% if field.field.is_hidden %} style="display: none"{% endif %}{% endfor %}{% endif %}>
        {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
        {% for field in line %}
            <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}{% if field.field.is_hidden %} style="display: none"{% endif %}>
                {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
                {% if field.is_checkbox %}
                    {{ field.field }}{{ field.label_tag }}
                {% else %}
                    {# only show the label for visible fields #}
                    {% if not field.field.is_hidden %}
                    {{ field.label_tag }}
                    {% endif %}

                    {% if field.is_readonly %}
                        <p>{{ field.contents }}</p>
                    {% else %}
                        {{ field.field }}
                    {% endif %}
                {% endif %}
                {% if field.field.help_text %}
                    <p class="help">{{ field.field.help_text|safe }}</p>
                {% endif %}
            </div>
        {% endfor %}
    </div>
{% endfor %}

答案 7 :(得分:0)

以下内容从您的所有表单字段中删除“:”。我只使用forms.Form类进行了尝试,但我相信它也适用于forms.ModelForm

在Django表单中,标签后面的':'是label_suffix。您可以通过创建label_suffix的子类(此处称为ModelForm)来更改或删除UnstyledForm,并重新定义初始化函数,并将label_suffix设置为空字符串。然后使用新的UnstyledForm课程。

class UnstyledForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('label_suffix', '')
        super(UnstyledForm, self).__init__(*args, **kwargs)

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

我希望有所帮助!

答案 8 :(得分:0)

另一种方法,但我认为迭代form.visible_fields&amp; form.hidden_​​fields

data.push($scope.item[arrayData[x]]); 

答案 9 :(得分:-19)

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

你明白了......