Como faço para ocultar o rótulo do campo para uma HiddenInput widget no Django admin?

StackOverflow https://stackoverflow.com/questions/1408940

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho um pouco de código do formulário Django que se parece com isso:

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

E isso faz com que o campo de formulário ir embora, mas deixa a etiqueta "Ordem" na página de administração do Django. Se eu usar:

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

Eu ainda estou à esquerda com o ":". Entre onde o campo e rótulo usado para ser

Como faço para ocultar a coisa toda?!

Foi útil?

Solução

Se você estiver usando JQuery isso deve fazer o truque:

O formulário

TO_HIDE_ATTRS = {'class': 'hidden'}
class GalleryAdminForm(forms.ModelForm):
    auto_id=False
    order = forms.CharField(widget=forms.TextInput(attrs=TO_HIDE_ATTRS))

código Javascript para adicionar ao seu modelo

$(document).ready(function(){
    $('tr:has(.hidden)').hide();
});

Isso funciona se você está tornando seu formulário como uma tabela. Se você quiser fazê-lo funcionar com qualquer tipo de forma de renderização que você pode fazer o seguinte:

$(document).ready(function(){
    $('{{ form_field_container }}:has(.hidden)').hide();
});

e adicione form_field_container ao seu contexto modelo. Um exemplo:

Se você tornar o seu formulário como este:

    <form>
        <span>{{ field.label_tag }} {{ field }}</span>
    </form>

O seu contexto deve incluir:

'form_field_container': 'span'

Você começa a idéia ...

Outras dicas

Oraculum tem razão. Você não deve ser limpar isso no lado do cliente. Se é desordem, então você não deve ser enviá-lo para o cliente em tudo. Com base na resposta do Oráculo, você deve usar um modelo de formulário personalizado, porque você provavelmente você ainda quer os valores escondidos no formulário.

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

Usando um modelo de formulário personalizado para controlar campos ocultos é mais limpo, porque ele não envia informações irrelevantes para o cliente.

Eu não posso acreditar que várias pessoas sugeriram o uso de jQuery para isso ...

É um caso de:? Quando a única ferramenta que você sabe é um martelo tudo parece um prego

Vamos lá, se você estiver indo para fazê-lo a partir do lado do cliente o (em vez de fixar a fonte do problema no código de back-end) certamente o lugar certo para fazê-lo seria em CSS?

Se você está no site de administração, então é um pouco mais difícil, mas se é uma página regular, então é fácil simplesmente omitir o rótulo inteiro a partir do modelo de formulário, por exemplo

Se você está no site de administração, em seguida, você ainda pode substituir o as_table, as_ul, métodos as_p de BaseForm (ver django / formas / forms.py) em sua classe GalleryAdminForm omitir o rótulo de qualquer campo onde o rótulo é em branco (ou == ':' como o valor pode ser nesta fase de renderização)

(... olhando para linhas 160-170 de formas .py parece que Django 1.2 deve omitir corretamente o ':' se o rótulo está em branco, então eu acho que você está em uma versão mais antiga)

Tente

{% para campo na form.visible_fields%}

Eu acho que é mais simples para alcançar o ":" omissão rótulo para HiddenInput Widget modificando class AdminField(object) em contrib/admin/helpers.py de:

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

para:

    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

Verifique a resposta em Criar um campo oculto no admin local , isso pode ser feito sem JavaScript, substituindo admin/includes/fieldset.html de lá, você pode injetar uma classe CSS, e fazer o resto.

Em teoria, você deve ser capaz de passar label_suffix para o construtor formulário. No entanto, a administração do Django ignora isso.

Você foi mordido por dois bugs no Django: # 18134 'BoundField.label_tag deve incluir form.label_suffix ' (corrigido no tronco, deve ser em 1,6) e, em menor extensão # 11277 campos ocultos em inlines são exibidas como linhas vazias .

Atualmente, a melhor solução é substituir o modelo de administração fieldset. Use um HiddenInput para o seu widget, em seguida, substituir o modelo de administração fieldset ( documentado aqui ). Basta criar uma templates/admin/includes/fieldset.html com o seguinte conteúdo:

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

Com base na solução por Wilfried Hughes I 've mudou o fieldset.html com pequenas melhorias.

O trecho de código abaixo não só esconde o elemento entrada em vez se o conjunto de campos contém apenas um único elemento que input-tipo é definido como oculto que também esconde a div-elementos circundantes Sem perder espaço no formulário.

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

Os seguintes remove o '' de todos os campos de formulário. Eu só tentei com a classe forms.Form, mas acredito que ele deve trabalhar para forms.ModelForm também.

formulários no Django, o ':' depois dos rótulos é a label_suffix. Você pode alterar ou remover a label_suffix criando uma subclasse de ModelForm, aqui chamado UnstyledForm, e redefinir a função de inicialização com o conjunto label_suffix para uma cadeia vazia. Em seguida, use sua nova classe 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())

Espero que ajude!

Outra maneira de fazer isso, mas eu acho que é ainda melhor para iterate form.visible_fields & form.hidden_fields

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top