tipos registro personalizados guardar formularios formulario ejemplos datos avanzados python django django-admin django-forms

python - registro - guardar datos de un formulario django



Django-Cómo rellenar los campos de formulario de administrador (7)

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

Consulte los documentos en: http://docs.djangoproject.com/en/dev/ref/models/fields/#default

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

Algo como: models.CharField (max_length = 250, predeterminado = "Texto predeterminado")

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 en función del campo de título.

Sin embargo, también me gustaría realizar otras prepoblaciones automáticas basadas en la fecha. Por ejemplo, tengo un campo de 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 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.


El manejo de slug se hace con javascript.

Por lo tanto, debe sobrescribir las plantillas en el administrador y luego rellenar 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 :).



La funcionalidad de prepopulated_fields incorporada de Django está codificada para slugify, realmente no se puede usar para propósitos más generales.

Tendrá que escribir su propia función de Javascript para hacer la prepoblación. La mejor forma de incluirlo en la página de administración es incluirlo en la clase Media interna de un Formulario o Widget personalizado . Luego deberá personalizar su subclase ModelAdmin 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 e indicarle 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 deducir de este resumen intrincado) rara vez es simple, especialmente si se está esforzando por mantener el código encapsulado.


Sé que puedes prepoblar 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 ayudarte.


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.


Intenté algunas de estas respuestas y ninguna de ellas funcionó. Simplemente quería preparar un campo con otro campo de un modelo relacionado. Tomando esta respuesta 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