Getting FieldError Unknown field(s)

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.

It’s a Python syntax oddity. You need to either have:
'fields': ('contactos_masinfo',)

(notice the comma after the field name)

or you need to specify it as a list and not a tuple:
'fields': ['contactos_masinfo']

See Built-in Types — Python 3.12.0 documentation and
5. Data Structures — Python 3.12.0 documentation
(among other references.)

Thank you very much Ken!!! That solved the problem. That’s what happens when you’re new to a programing language! :laughing: