2010-01-18 18 views
27

Hace un tiempo hice una clase de modelo. Hice varios ModelForms para él y funcionó maravillosamente.Campo oculto en Django Modelo

Recientemente tuve que agregar otro campo opcional (en blanco = verdadero, nulo = verdadero) para poder almacenar algunos datos de relación entre los usuarios. Es esencialmente un sistema de referencia.

El problema es agregar que este nuevo campo ha significado que el campo de referencia aparece donde no he cambiado el ModelForms para excluirlo. Normalmente esto solo significaría 10 minutos adicionales y excluirlos, pero en este caso, debido a políticas de gestión de proyectos fuera de mi control, solo tengo control sobre los Modelos para esta aplicación.

¿Puedo ya sea:

  • establecer el campo de auto-excluye?
  • Configúrelo para que quede oculto (aceptable si no es perfecto)?

Respuesta

47

de los documentos en Using a subset of fields on the form:

Establecer editable = False en el campo del modelo. Como resultado, cualquier formulario creado a partir del modelo a través de ModelForm no incluirá ese campo.

+2

magia. Funciona exactamente como lo necesito ¡Gracias! – Oli

+7

Tienes que admitir que esto no tiene mucho sentido. ¿Qué sucede si quiero que un campo sea de solo lectura? Eso es lo que editable = False debería hacer en lugar de ocultarlo. –

+0

@JustinY Mis pensamientos exactamente. –

4

Puede definir una subclase de campo de modelo personalizada y anular el método formfield() para devolver un campo con un widget HiddenInput. Ver the documentation for custom fields.

+0

Sí, estaba viendo esto antes de la respuesta de Ofri. Francamente, me alegro de que haya una manera simple de hacer lo que quería, pero, por supuesto, hay escenarios que requieren campos personalizados. Gracias por tu respuesta. – Oli

66

Si tiene acceso a la plantilla que podría hacer que tiene un campo oculto con el siguiente código:

{{ form.field_name.as_hidden }} 

en lugar de la norma:

{{ form.field_name }} 
+13

¿Cómo descubrió la propiedad "as_hidden"? No pude encontrarlo en los documentos de django. Yo también estaba tratando de descubrir cómo usarlo y gracias a ti ahora lo sé. – iJK

+13

Lo descubrí leyendo el código fuente de django. Realmente puedo recomendar investigar la fuente de django. Es realmente fácil de entender y bien estructurado. –

+2

+1 Sabía que esta propiedad tenía que existir. – russjman

1

A pesar de que usted ha mencionado que no se puede utilizar exclusión en su caso, creo que otros que se encuentran con esta respuesta (como yo mismo, basado en el título) pueden encontrarla útil.

Es posible ocultar selectivamente campos usando exclude en ModelAdmin, aquí es un fragmento de algo que estoy trabajando en:

class ItemsAdmin(admin.ModelAdmin): 
    form = ItemsForm 
    actions = None 
    list_display = ('item_id', 'item_type', 'item_title', 'item_size', 'item_color',) 
    search_fields = ('item_id', 'item_title',) 
    inlines = [ImageInline,] 
    readonly_fields = ('disable_add_date','disable_remove_date',) 
    exclude = ('add_date', 'remove_date',) 
    ###............. 
Cuestiones relacionadas