代码之家  ›  专栏  ›  技术社区  ›  Gabriel Hurley

如何在django admin中隐藏hiddeninput小部件的字段标签?

  •  16
  • Gabriel Hurley  · 技术社区  · 15 年前

    我有一些像这样的django表单代码:

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

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

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

    我仍然只剩下“:”在字段和标签原来的位置之间。

    我该如何隐藏整个事情?!

    10 回复  |  直到 8 年前
        1
  •  -19
  •   Guillem Gelabert    15 年前

    如果您使用的是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'
    

    你明白了…

        2
  •  38
  •   emispowder    12 年前

    奥卡鲁姆说得对。你不应该在客户那边清理这个。如果它是杂乱的,那么您根本不应该将它发送给客户机。基于Oraclum的答案,您应该使用自定义表单模板,因为您可能仍然想要表单中的隐藏值。

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

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

        3
  •  36
  •   Derek Adair    10 年前

    我不敢相信有几个人建议使用jquery来解决这个问题…

    这是一个例子吗:当你知道的唯一工具是锤子时,所有东西看起来都像钉子?

    拜托,如果您打算从客户端(而不是在后端代码中修复问题的源代码)执行此操作,那么在CSS中执行此操作的位置肯定是正确的?

    如果你在管理网站,那就有点难了,但是如果它是一个常规页面,那么很容易忽略表单模板中的整个标签, for example

    如果您在管理站点中,那么您仍然可以将galleryAdminForm类中的as_表、as_l、as_l、as_p方法重写为baseForm(请参见django/forms/forms.py),以省略标签为空的任何字段的标签(或=':'因为值可能在呈现的这个阶段)。

    (…查看第160-170行 forms.py 似乎django 1.2应该适当地省略“:”,如果标签是空白的,那么我猜您是在旧版本上吗?)

        4
  •  17
  •   Damon Abdiel    12 年前

    尝试

    %表示窗体中的字段。可见的_字段%

        5
  •  3
  •   Tonino    15 年前

    我认为通过修改hiddeninput小部件来实现“:”标签省略更简单。 class AdminField(object) 在里面 contrib/admin/helpers.py 来自:

        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
    
        6
  •  3
  •   Community CDub    7 年前

    检查答案 Create a hidden field in the admin site ,可以在不使用javascript的情况下通过重写 admin/includes/fieldset.html 从那里,您可以注入一个CSS类,并完成其余的工作。

        7
  •  2
  •   Wilfred Hughes AntuanSoft    11 年前

    理论上,你应该能够通过 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 .

    目前,最好的解决方案是重写管理字段集模板。使用A 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>
    
        8
  •  2
  •   brasofilo Gary    10 年前

    基于Wilfried Hughes的解决方案,我对fieldset.html进行了一些改进。

    下面的代码段不仅隐藏了输入元素,而且如果字段集只包含一个输入类型设置为隐藏的元素,它还隐藏了表单中不浪费空间的周围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 %}
    

        9
  •  0
  •   SarahJaine    8 年前

    下面将从所有表单字段中删除“:”。我只试过用 forms.Form 但是我相信它应该适用于 forms.ModelForm 也一样。

    在Django窗体中,标签后面的“:”是 label_suffix . 您可以更改或删除 唇舌后缀 通过创建 ModelForm 这里叫 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())
    

    希望有帮助!

        10
  •  0
  •   Rafa He So    8 年前

    另一种方法,但我认为迭代form.visible&form.hidden\u字段更好

    <form action="{% url 'some_url' param %}" method="POST">
        {% csrf_token %}
        <div class="row">
            {% for field in form %}
    
                {% if not field.is_hidden %}
                    <div class="col-md-6">
                        {{ field.label_tag }}
                        {{ field.error }}
                        {{ field }}
                    </div>
                {% else %}
                    {{ field }}
                {% endif %}
            {% endfor %}
         </div>
    </form>