2011-02-15 17 views
10

¿Cómo puedo crear un campo totalmente oculto (entrada y etiqueta) en el sitio de administración? que sé sobre la propiedad exclude, pero excluye totalmente el campo de la plantilla, mientras que lo necesito en la página web, pero oculto:Crear un campo oculto en el sitio de administración

class OutForm(ModelForm): 
    reply_to = forms.ModelChoiceField(queryset=InMessages.objects.all(), widget=forms.HiddenInput) 

En la plantilla de administración realmente puedo ocultar un campo, pero no su etiqueta.

Respuesta

0

Usted está dando ModelForm en su ejemplo, no ModelAdmin que debe utilizar para el sitio de administración.

De todos modos, el método de exclusión de algún campo es el mismo: especificar en exclude propiedad:

class OutForm(ModelForm): 
    class Meta: 
    exclude = ["reply_to"] 

o

class OutAdmin(ModelAdmin): 
    exclude = ["reply_to"] 
documentación

Ver Django para más detalles: http://docs.djangoproject.com/en/1.2/ref/contrib/admin/

+7

No, quizás no me entienda. El método excluye no crear un campo oculto, lo excluye del formulario y no lo muestra en la página de salida (en plantilla) – gigimon

0

Trate de añadir etiquetas = "" a su ModelChoiceField para hacer que la etiqueta sea una cadena vacía:

reply_to = forms.ModelChoiceField(queryset=InMessages.objects.all(), label="", widget=forms.HiddenInput) 
+0

Esto oculta la etiqueta, pero deja un ':'. Ver [esta pregunta] (http: // stackoverflow.com/questions/1408940/how-do-i-hide-the-field-label-for-a-hiddeninput-widget-in-django-admin). –

14

El administrador de Django aún no admite campos ocultos. Hay un ticket abierto para eso: https://code.djangoproject.com/ticket/11277

Sin embargo, hay soluciones que no requieren jQuery. Los formularios de administración se representan usando admin/includes/fieldset.html. Si anula esta plantilla, se puede inyectar una clase CSS para indicar la fila para ocultar:

<div class="form-row 
    {% if line.fields|length_is:'1' and line.errors %} errors{% endif %} 
    {% for field in line %} {{ field.field.name }} 
     {% if field.field.is_hidden %} has-hidden-field{% endif %} # add this part 
    {% endfor %}"> 

esto es en realidad una sola línea en el archivo, he ampliado para que sea más legible.

(detalle aseado: durante objetos StackedInline/TabularInline, puede especificar la plantilla como variable en el código Python.)

A continuación, puede ocultar que la fila de la CSS:

.form-row.has-hidden-field { 
    display: none; 
} 

que se puede cargar a través de su página de administración:

{% block extrastyle %}{{ block.super }} 
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}mysite/admin.css" />{% endblock %} 

o mediante el uso de la definición de medios en el modeladmin:

class Media: 
    css = {'all': ('mysite/admin.css',) 
+0

No estoy seguro de que la técnica '.form-row.has-hidden-field' funcione en todas las versiones de IE. –

+0

@Glide: IE6 solo recuerda la última clase, leyéndola como ".has-hidden-field", así que está bien la mayor parte del tiempo. IE7 y superior lo admiten correctamente. Si esto es una preocupación, puede cambiar el nombre de la clase a algo único, y siempre se refieren a eso en el CSS. – vdboor

2

En la plantilla, al tiempo que muestra

{% for field in form.visible_fields %} 
    {{ field.label_tag }} : {{ field }} 
{% endfor %} 

Será ocultar las etiquetas de los campos ocultos.

+0

impresionante, funciona! – Dragunov

1

Me pareció bastante útil usar el atributo 'classes' en fieldsets para ocultar los campos pero aún así dejarlos en una solicitud. En el administrador de su modelo puede escribir

fieldsets = [ 
     ('Visible Fields', 
     {'fields': [('name', 'comment'),]}), 
     ('Collapsable Fields', 
     {'fields': [('rare_property',)],'classes': ['collapse']}), 
     ('Hidden Fields', 
     {'fields': [('magic_property',)],'classes': ['hidden']}), 
      ] 
Cuestiones relacionadas