tutorial superusuario create crear python django django-admin

python - superusuario - django tutorial



¿Cómo oculto la etiqueta de campo para un widget HiddenInput en Django Admin? (10)

Tengo un poco de código de formulario Django que se ve así:

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

Y eso hace que el campo de formulario desaparezca, pero deja la etiqueta "Orden" en la página de administración de Django. Si uso:

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

Todavía me queda el ":" entre donde solía estar el campo y la etiqueta.

¿Cómo escondo todo esto?


Basándome en la solución de Wilfried Hughes, cambié el fieldset.html con pequeñas mejoras.

El fragmento de código a continuación no solo oculta el elemento de entrada sino que, si el campo de campo contiene solo un elemento único cuyo tipo de entrada se establece como oculto, también oculta los elementos div que lo rodean, sin perder espacio en el formulario.

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


Creo que es más sencillo lograr la omisión de la etiqueta ":" para el widget HiddenInput al modificar la class AdminField(object) en contrib/admin/helpers.py desde:

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

a :

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


En teoría, debería poder pasar label_suffix al constructor de formularios. Sin embargo, el administrador de Django ignora esto.

Ha sido mordido por dos errores en Django: # 18134 ''BoundField.label_tag debe incluir form.label_suffix'' (fijado en el tronco, debería estar en 1.6) y en menor medida # 11277 Los campos ocultos en Inlines se muestran como filas vacías .

Actualmente, la mejor solución es anular la plantilla de conjunto de campos de administración. Use un HiddenInput para su widget, luego anule la plantilla de conjunto de campos de administración ( documentado aquí ). Simplemente cree una templates/admin/includes/fieldset.html con el siguiente contenido:

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


Lo siguiente elimina el '':'' de todos sus campos de formulario. Solo lo he intentado con la clase forms.Form , pero creo que debería funcionar para forms.ModelForm también.

En las formas de Django, el '':'' después de las etiquetas es el label_suffix . Puede cambiar o eliminar el label_suffix creando una subclase de ModelForm , aquí llamada UnstyledForm , y redefiniendo la función de inicialización con label_suffix establecido en una cadena vacía. Luego usa tu nueva clase 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 eso ayude!


No puedo creer que varias personas hayan sugerido usar jQuery para esto ...

¿Se trata de: cuando la única herramienta que conoces es un martillo, todo parece un clavo?

Vamos, si lo vas a hacer desde el lado del cliente (en lugar de arreglar la fuente del problema en el código de fondo), seguramente el lugar correcto para hacerlo sería en CSS.

Si está en el sitio de administración, entonces es un poco más difícil, pero si es una página normal, es fácil omitir toda la etiqueta de la plantilla de formulario, por ejemplo

Si está en el sitio de administración, aún podría anular los métodos as_table, as_ul, as_p de BaseForm (vea django / forms / forms.py) en su clase GalleryAdminForm para omitir la etiqueta de cualquier campo donde la etiqueta esté en blanco (o == '':'' ya que el valor puede estar en esta etapa de representación)

(... mirando las líneas 160-170 de forms.py , parece que Django 1.2 debería omitir correctamente el '':'' si la etiqueta está en blanco, así que supongo que está en una versión anterior.)


Oraculum lo ha hecho bien. No deberías estar limpiando esto en el lado del cliente. Si es un desorden, no deberías enviarlo al cliente en absoluto. Sobre la base de la respuesta de Oraculum, debe usar una plantilla de formulario personalizada, ya que probablemente aún desee los valores ocultos en el formulario.

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

El uso de una plantilla de formulario personalizada para controlar campos ocultos es más limpio porque no envía información extraña al cliente.


Otra forma de hacerlo, pero creo que todavía es mejor iterar 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>


Si estás usando JQuery, esto debería hacer el truco:

Su formulario

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 agregar a tu plantilla

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

Eso funciona si estás representando tu formulario como una tabla. Si desea que funcione con cualquier tipo de representación de formularios, puede hacer lo siguiente:

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

Y añada form_field_container a su contexto de plantilla. Un ejemplo:

Si renderizas tu forma así:

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

Su contexto debe incluir:

''form_field_container'': ''span''

Tienes la idea ...


Tratar

{% para el campo en form.visible_fields%}