widgets form fields example errors django admin

fields - django model form



django admin-agrega campos de formulario personalizados que no son parte del modelo (4)

Es posible hacerlo en el administrador, pero no hay una manera muy directa de hacerlo. Además, me gustaría aconsejarle que mantenga la lógica empresarial en sus modelos, para que no dependa del administrador de Django.

Tal vez sería más fácil (y tal vez incluso mejor) si tienes los dos campos separados en tu modelo. A continuación, agregue un método en su modelo que los combine.

Por ejemplo:

class MyModel(models.model): field1 = models.CharField(max_length=10) field2 = models.CharField(max_length=10) def combined_fields(self): return ''{} {}''.format(self.field1, self.field2)

Luego, en el administrador, puede agregar los campos combined_fields() como un campo de solo lectura:

class MyModelAdmin(models.ModelAdmin): list_display = (''field1'', ''field2'', ''combined_fields'') readonly_fields = (''combined_fields'',) def combined_fields(self, obj): return obj.combined_fields()

Si desea almacenar los combined_fields en la base de datos, también puede guardarlos cuando guarde el modelo:

def save(self, *args, **kwargs): self.field3 = self.combined_fields() super(MyModel, self).save(*args, **kwargs)

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, basándose en estos valores de campos, construiré la expresión de cadena larga y la guardaré en el campo de 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 son parte del modelo) y cuando hace clic en guardar, entonces creo una representación de expresión de cadena desde el lista de símbolos y almacenarlo en el DB. No quiero que los símbolos sean parte del modelo y DB, solo la expresión final.


Si solo desea almacenar el campo combinado en el modelo y no los dos campos separados, podría hacer algo como esto:

Nunca hice algo así, así que no estoy completamente seguro de cómo funcionará.


Ya sea en su admin.py o en forms.py por separado, puede agregar una clase ModelForm y luego declarar sus campos adicionales como lo haría normalmente. También he dado un ejemplo de cómo puede usar estos valores en form.save ():

from django import forms from yourapp.models import YourModel class YourModelForm(forms.ModelForm): extra_field = forms.CharField() def save(self, commit=True): extra_field = self.cleaned_data.get(''extra_field'', None) # ...do something with extra_field here... return super(YourModelForm, self).save(commit=commit) class Meta: model = YourModel

Para que los campos adicionales aparezcan en el administrador solo:

  1. edite su admin.py y configure la propiedad del formulario para hacer referencia al formulario que creó anteriormente
  2. incluya sus nuevos campos en sus campos o declaración de conjuntos de campo

Me gusta esto:

class YourModelAdmin(admin.ModelAdmin): form = YourModelForm fieldsets = ( (None, { ''fields'': (''name'', ''description'', ''extra_field'',), }), )

ACTUALIZACIÓN: en django 1.8 necesita agregar fields = ''__all__'' a la metaclase de YourModelForm.


siempre puede crear una nueva plantilla de administrador y hacer lo que necesita en su vista de administrador (anule la url de agregar administrador a su vista de administrador):

url(r''^admin/mymodel/mymodel/add/$'' , ''admin_views.add_my_special_model'')