Hello there!
I’m pretty new to Django, only been working with it for a couple week so far. Hope you can help me with this error.
In my model.py I’ve four models that are almost identical:
class Abogados(models.Model):
abogados_id = models.AutoField(primary_key=True, verbose_name="Id")
abogados_nombre = models.CharField(max_length=45, verbose_name="Nombre")
abogados_apellido = models.CharField(max_length=45, verbose_name="Apellidos")
abogados_email = models.EmailField(max_length=60, verbose_name="Email")
abogados_telefono = models.CharField(max_length=11, verbose_name="Telefono")
abogados_direccion = models.CharField(max_length=90, blank=True, null=True, verbose_name="Direccion")
abogados_ciudad = models.CharField(max_length=45, blank=True, null=True, verbose_name="Ciudad")
abogados_cp = models.IntegerField(blank=True, null=True, verbose_name="Codigo Postal")
abogados_numcol = models.IntegerField(verbose_name="Num. Colegiado")
abogados_despacho = models.CharField(max_length=45, blank=True, null=True, verbose_name="Despacho")
abogados_propio = models.BooleanField(default=False, verbose_name="Propio")
abogados_masinfo = models.TextField(blank=True, null=True, verbose_name="Mas Info.")
abogados_creado = models.DateTimeField(auto_now_add=True)
abogados_actualizado = models.DateTimeField(auto_now=True)
class Meta:
managed = False
db_table = 'abogados'
verbose_name_plural = "Abogados"
verbose_name = "Abogado"
class Admonsociedades(models.Model):
admonsociedades_id = models.AutoField(primary_key=True, verbose_name="Id")
admonsociedades_nombre = models.CharField(max_length=45, verbose_name="Nombre")
admonsociedades_apellidos = models.CharField(max_length=45, verbose_name="Apellidos")
admonsociedades_nif = models.CharField(max_length=20, blank=True, null=True, verbose_name="NIF/CIF")
admonsociedades_email = models.EmailField(max_length=60, verbose_name="Email")
admonsociedades_telefono = models.CharField(max_length=11, verbose_name="Telefono")
admonsociedades_direccion = models.CharField(max_length=90, blank=True, null=True, verbose_name="Direccion")
admonsociedades_ciudad = models.CharField(max_length=45, blank=True, null=True, verbose_name="Ciudad")
admonsociedades_cp = models.IntegerField(blank=True, null=True, verbose_name="Codigo Postal")
admonsociedades_masinfo = models.TextField(blank=True, null=True, verbose_name="Mas Info.")
admonsociedades_creado = models.DateTimeField(auto_now_add=True)
admonsociedades_actualizado = models.DateTimeField(auto_now=True)
clientes_clientes = models.ForeignKey('Clientes', models.CASCADE, verbose_name="Cliente Asociado")
class Meta:
managed = False
db_table = 'admonsociedades'
verbose_name_plural = "Admon. Sociedades"
verbose_name = "Admon. Sociedad"
class Clientes(models.Model):
clientes_id = models.AutoField(primary_key=True, verbose_name='Id')
clientes_nombre = models.CharField(max_length=45, verbose_name='Nombre')
clientes_apellidos = models.CharField(max_length=60, blank=True, null=True, verbose_name='Apellidos')
clientes_telefono = models.CharField(max_length=11, blank=True, null=True, verbose_name='Telefono')
clientes_email = models.EmailField(max_length=45, blank=True, null=True, verbose_name='Email')
clientes_direccion = models.CharField(max_length=90, blank=True, null=True, verbose_name='Direccion')
clientes_ciudad = models.CharField(max_length=45, blank=True, null=True, verbose_name='Ciudad')
clientes_cp = models.IntegerField(blank=True, null=True, verbose_name='Codigo Postal')
clientes_nif = models.CharField(max_length=12, blank=True, null=True, verbose_name='NIF/CIF')
clientes_empresa = models.BooleanField(default=False, verbose_name='Es Empresa')
clientes_masinfo = models.TextField(blank=True, null=True, verbose_name='Mas Info.')
clientes_creado = models.DateTimeField(auto_now_add=True)
clientes_actualizado = models.DateTimeField(auto_now=True)
class Meta:
managed = False
db_table = 'clientes'
verbose_name_plural='Clientes'
verbose_name = 'Cliente'
class Contactos(models.Model):
contactos_id = models.AutoField(primary_key=True, verbose_name = 'Id')
contactos_nombre = models.CharField(max_length=45, verbose_name = 'Nombre')
contactos_apellidos = models.CharField(max_length=45, verbose_name = 'Apellidos')
contactos_email = models.EmailField(max_length=60, verbose_name = 'Email')
contactos_telefono = models.CharField(max_length=11, verbose_name = 'Telefono')
contactos_direccion = models.CharField(max_length=90, blank=True, null=True, verbose_name = 'Direccion')
contactos_ciudad = models.CharField(max_length=45, blank=True, null=True, verbose_name = 'Ciudad')
contactos_cp = models.IntegerField(blank=True, null=True, verbose_name = 'Codigo Postal')
contactos_masinfo = models.TextField(blank=True, null=True, verbose_name = 'Mas Info.')
contactos_creado = models.DateTimeField(auto_now_add=True)
contactos_actualizado = models.DateTimeField(auto_now=True)
class Meta:
managed = False
db_table = 'contactos'
verbose_name_plural = 'Contactos'
verbose_name = 'Contacto'
I’ve imported the models to Admin.py and registered them properly. Then I also declared these four classes in Admin.py in order to customize the forms:
class ClientesAdmin(admin.ModelAdmin):
list_display = ('clientes_id', 'nombre_completo', 'clientes_telefono')
list_display_links = ('clientes_id', 'nombre_completo')
def nombre_completo(self, obj):
return f'{obj.clientes_nombre} {obj.clientes_apellidos}'
nombre_completo.short_description = 'Nombre Completo' # Personaliza el encabezado del campo calculado
# Personaliza los encabezados de los campos
fieldsets = (
('Información Personal', {
'fields': ('clientes_nombre', 'clientes_apellidos', 'clientes_nif')
}),
('Información de Contacto', {
'fields': ('clientes_telefono', 'clientes_email', 'clientes_direccion', 'clientes_ciudad', 'clientes_cp')
}),
('Otras Opciones', {
'fields': ('clientes_masinfo', 'clientes_empresa')
}),
)
class ContactosAdmin(admin.ModelAdmin):
list_display = ('contactos_id', 'nombre_completo', 'contactos_telefono')
list_display_links = ('contactos_id', 'nombre_completo')
def nombre_completo(self, obj):
return f'{obj.contactos_nombre} {obj.contactos_apellidos}'
nombre_completo.short_description = 'Nombre Completo' # Personaliza el encabezado del campo calculado
# Personaliza los encabezados de los campos
fieldsets = (
('Información Personal', {
'fields': ('contactos_nombre', 'contactos_apellidos')
}),
('Información de Contacto', {
'fields': ('contactos_telefono', 'contactos_email', 'contactos_direccion', 'contactos_ciudad', 'contactos_cp')
}),
('Otras Opciones', {
'fields': ('contactos_masinfo')
}),
)
class AdmonsociedadesAdmin(admin.ModelAdmin):
list_display = ('admonsociedades_id', 'nombre_completo', 'admonsociedades_nif')
list_display_links = ('admonsociedades_id', 'nombre_completo')
def nombre_completo(self, obj):
return f'{obj.admonsociedades_nombre} {obj.admonsociedades_apellidos}'
nombre_completo.short_description = 'Nombre Completo' # Personaliza el encabezado del campo calculado
# Personaliza los encabezados de los campos
fieldsets = (
('Información Personal', {
'fields': ('admonsociedades_nombre', 'admonsociedades_apellidos', 'admonsociedades_nif')
}),
('Información de Contacto', {
'fields': ('admonsociedades_telefono', 'admonsociedades_email', 'admonsociedades_direccion', 'admonsociedades_ciudad', 'admonsociedades_cp')
}),
('Otras Opciones', {
'fields': ('admonsociedades_masinfo', 'clientes_clientes')
}),
)
class AbogadosAdmin(admin.ModelAdmin):
list_display = ('abogados_id', 'nombre_completo', 'abogados_email', 'abogados_telefono')
list_display_links = ('abogados_id', 'nombre_completo')
def nombre_completo(self, obj):
return f'{obj.abogados_nombre} {obj.abogados_apellido}'
nombre_completo.short_description = 'Nombre Completo' # Personaliza el encabezado del campo calculado
# Personaliza los encabezados de los campos
fieldsets = (
('Información Personal', {
'fields': ('abogados_nombre', 'abogados_apellido', 'abogados_numcol')
}),
('Información de Contacto', {
'fields': ('abogados_telefono', 'abogados_email', 'abogados_direccion', 'abogados_ciudad', 'abogados_cp', 'abogados_despacho')
}),
('Otras Opciones', {
'fields': ('abogados_masinfo', 'abogados_propio')
}),
)
As you might notice the classes are very similar.
I’ve also registered them properly.
Three of them work like intended: Admonsociedades, Clientes and Abogados, but I get an error when I try to add a new Contacto:
FieldError at /admin/lyf/contactos/add/
Unknown field(s) (_, o, t, m, n, a, s, c, i, f) specified for Contactos. Check fields/fieldsets/exclude attributes of class ContactosAdmin.
Request Method: GET
Request URL: http://ec2-15-188-64-93.eu-west-3.compute.amazonaws.com/admin/lyf/contactos/add/
Django Version: 4.2.4
Exception Type: FieldError
Exception Value:
Unknown field(s) (_, o, t, m, n, a, s, c, i, f) specified for Contactos. Check fields/fieldsets/exclude attributes of class ContactosAdmin.
Exception Location: /var/www/lyf/venv/lib/python3.10/site-packages/django/contrib/admin/options.py, line 811, in get_form
Raised during: django.contrib.admin.options.add_view
Python Executable: /var/www/lyf/venv/bin/python
Python Version: 3.10.12
Python Path:
['/var/www/lyf/source',
'/usr/lib/python310.zip',
'/usr/lib/python3.10',
'/usr/lib/python3.10/lib-dynload',
'/var/www/lyf/venv/lib/python3.10/site-packages']
Server time: Sun, 27 Aug 2023 14:02:23 +0000
Needless to say that there are no “_, o, t, m, n, a, s, c, i, f” anywhere. Another weird thing is that everytime I restart Apache, the supposed unknown fields order change:
Restart one: _, o, t, m, n, a, s, c, i, f
Restart two: a, n, m, c, o, i, t, f, s, _
Restart three: o, c, f, a, _, t, m, s, n, i
…
I’m sure I have made any kind of stupid error that I cannot figure out.
Thanks in advance for your help.