Como faço para ocultar o rótulo do campo para uma HiddenInput widget no Django admin?
-
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?!
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>