2009-02-09 28 views
17

Sé que puede rellenar campos de formulario de administrador en función de otros campos. Por ejemplo, tengo un campo slug que se rellena automáticamente según el campo de título.Django - Cómo llenar previamente los campos de formulario de administrador

Sin embargo, también me gustaría realizar otras prepoblaciones automáticas basadas en la fecha. Por ejemplo, tengo un campo URL, y quiero que se establezca automáticamente en http://example.com/20090209.mp3, donde 20090209 es AAAAMMDD.

También me gustaría tener un campo de texto que comience automáticamente con algo así como "Hola, mi nombre es autor", donde autor es el nombre del usuario actual. Por supuesto, también quiero que la persona pueda editar el campo. El punto es hacer que el usuario pueda completar el formulario de administración más fácilmente y no solo tener campos que son completamente automáticos.

Respuesta

2

El manejo de slug se realiza con javascript.

Así que tiene que override las plantillas en el administrador y luego rellene los campos con javascript. La cosa de la fecha debería ser trivial, pero no sé cómo deberías poner el nombre de los usuarios que iniciaron sesión en el guión (no es que lo haya pensado muy bien, pero te das cuenta :).

2

también me gustaría tener un campo de texto que se inicia automáticamente con algo como "Hola mi nombre es autor".

Mira la documentación en: http://docs.djangoproject.com/en/dev/ref/models/fields/#default

usted podría tener un CharField() o TextField() en su modelo, y establecer esta opción, que establecerá el texto predeterminado. 'predeterminado' también puede ser una función invocable.

Algo así como: models.CharField (max_length = 250, por defecto = "texto predeterminado")

+1

No creo que esto cumpla con los requisitos. La idea es rellenar previamente un campo basado en el valor recién ingresado de otro, todo en Javascript. Los valores predeterminados que se pueden llamar en el servidor no ayudarán con eso. –

+0

@Carl - eso tiene sentido, simplemente no lo leí así. Gracias. –

3

Puede anular el campo de administración de Django por defecto reemplazándolo con un campo de formulario de su elección.

Comprobar esto: Add custom validation to the admin

12

de Django incorporada prepopulated_fields funcionalidad está codificado a slugear, que en realidad no puede ser utilizado para fines más generales.

Tendrá que escribir su propia función de Javascript para hacer la prepoblación. La mejor manera de incluirlo en la página de administración es incluirlo en el inner Media class de un formulario personalizado o Widget. Luego deberá personalizar su ModelAdmin subclass para usar el formulario o widget personalizado. Por último, deberá presentar un Javascript en línea junto con cada campo rellenado previamente para registrar el controlador onchange y decirle de qué otro campo llenar; Lo renderizaría a través del widget personalizado. Para hacerlo agradable y declarativo, podría usar un atributo personalizado de ModelAdmin (similar a los campos prepoblados), y anular ModelAdmin.formfield_for_dbfield para crear el widget y pasar la información sobre el campo desde el que debe rellenar previamente.

Este tipo de pirateo de administrador casi siempre es posible, pero (como se puede ver en este resumen intrincado) rara vez es simple, especialmente si se está esforzando por mantener el código encapsulado.

+0

+1 para desglosar cómo funciona todo. – tatlar

24

Sé que se puede rellenar previamente algunos valores a través de GET, será algo como esto

http://localhost:8000/admin/app/model/add/?model_field=hello 

Tengo algunos problemas con los campos de fecha, pero, tal vez esto podría ayudarle.

+0

¡Bueno, nunca lo supe! Gracias: D –

+0

¡Eso es GENIUS! ¿Como lo descubriste? Docs? –

+0

lol, ni siquiera recuerdo – sacabuche

10

Recientemente utilicé el método ModelAdmin.get_form de Django para este propósito.

class MyModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(MyModelAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['my_field_name'].initial = 'abcd' 
     return form 

Yout debe tener cuidado con los efectos secundarios ya que está manipulando los campos base_ directamente.

0

Intenté algunas de estas respuestas y ninguna de ellas funcionó. Simplemente quería preparar un campo con otro campo de un modelo relacionado. Tomando this como punto de partida, finalmente traté de manipular el objeto de instancia modelo (aquí obj) directamente y funcionó para mí.

class MyModelAdmin(models.ModelAdmin): 

    def get_form(self, request, obj=None, **kwargs): 
     form = super(MyModelAdmin, self).get_form(request, obj, **kwargs) 
     if not obj.some_model_field: 
      obj.some_model_field = obj.related_model.prepopulating_model_field 

     return form 
Cuestiones relacionadas