Tengo un modelo registrado en el sitio de administración. Uno de sus campos es una expresión de cadena larga. Me gustaría agregar campos de formulario personalizados a la página de agregar / actualizar de este modelo en el administrador que, según los valores de estos campos, construiré la expresión de cadena larga y la guardaré en el campo del modelo relevante.
¿Cómo puedo hacer eso?
ACTUALIZACIÓN: Básicamente, lo que estoy haciendo es construir una expresión matemática o de cadena a partir de símbolos, el usuario elige símbolos (estos son los campos personalizados que no forman parte del modelo) y cuando hace clic en guardar, creo una representación de expresión de cadena desde el lista de símbolos y almacenarla en la base de datos. No quiero que los símbolos sean parte del modelo y DB, solo la expresión final.
fields = '__all__'
en suMeta
clase, de lo contrario django se queja:Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated
YourModelAdmin.list_display[0], 'extra_field' is not a callable or an attribute of 'YourModelAdmin' or found in the model 'YourModel'.
AttributeError: Unable to lookup "extra_field"...
, intente agregar unlabel
a laextra_field
definición. Parece que django intenta "adivinar" la etiqueta, mirando enModel
y en laModelAdmin
definición de ese atributo.Unknown field(s) (extra_field) specified for YourModel. Check fields/fieldsets/exclude attributes of class YourModelAdmin.
. La solución para eso esextra_field = forms.CharField(widget=forms.HiddenInput())
Es posible hacerlo en el administrador, pero no hay una forma muy sencilla de hacerlo. Además, me gustaría recomendarle mantener la mayor parte de la lógica empresarial en sus modelos, para que no dependa del administrador de Django.
Quizás sería más fácil (y quizás incluso mejor) si tiene los dos campos separados en su modelo. Luego agregue un método en su modelo que los combine.
Por ejemplo:
Luego, en el administrador puede agregar
combined_fields()
como un campo de solo lectura:Si desea almacenar el
combined_fields
en la base de datos, también puede guardarlo cuando guarde el modelo:fuente
save()
método del modelo , verifique las actualizaciones de mi respuesta.Django 2.1.1 La respuesta principal me llevó a la mitad de la respuesta a mi pregunta. No me ayudó a guardar el resultado en un campo en mi modelo real. En mi caso, quería un campo de texto en el que un usuario pudiera ingresar datos, luego, cuando ocurriera un guardado, los datos se procesarían y el resultado se colocaría en un campo en el modelo y se guardaría. Si bien la respuesta original mostró cómo obtener el valor del campo adicional, no mostró cómo guardarlo de nuevo en el modelo al menos en Django 2.1.1
Esto toma el valor de un campo personalizado independiente, lo procesa y lo guarda en mi campo de descripción real:
fuente
siempre puede crear una nueva plantilla de administrador y hacer lo que necesite en su vista de administración (anule la URL de adición de administrador a su vista de administración):
fuente
Si absolutamente solo desea almacenar el campo combinado en el modelo y no los dos campos separados, puede hacer algo como esto:
form
atributo en suModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form )save_formset
método en suModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model )Nunca hice algo como esto, así que no estoy completamente seguro de cómo funcionará.
fuente