简体   繁体   中英

Django admin unable to find subclass of models.CharField

I'm building an extention of the AbstractUser model for a django project and i have a couple of fields which should autopopulate, a unique string a creation and modified timestamp.

Im using fields from the package django-model-utils to get creation and modified working and i've built my own custom field for the code according to the same principle.

The django admin seems unable to find these fields.

The fields seems to be working everywhere except in django-admin.

Here is the barebones of the code:

models.py from django.contrib.auth.models import AbstractUser

from model_utils import Choices
from model_utils.fields import AutoCreatedField, AutoLastModifiedField

from .fields import CoombaCodeField



class CoombaUser(AbstractUser):
    # class CoombaUser(models.Model):
    # Timestamp. Created timestamp is suppled by AbstractUser, as date_joined
    modified = AutoLastModifiedField(_('modified'))

    # string identifer, used in referrals
    coomba_code = CoombaCodeField()

fields.py

from django.db import models, OperationalError

from core.keyGenerators import ShortKeyGenerator, KeyGenerator

from .settings import COOMBA_CODE_COUNTER_KEY, COOMBA_CODE_COUNTER_MINIMUM

# Impossible to call code accessing databases before databases are created.
# Code below moves database call to first use.

coomba_code_generator = None


def get_key():
    global coomba_code_generator
    if(coomba_code_generator is None):
        coomba_code_generator = ShortKeyGenerator(
            charset=KeyGenerator.CHARSET_FULL,
            counter_key=COOMBA_CODE_COUNTER_KEY,
            smallest_allowed_value=COOMBA_CODE_COUNTER_MINIMUM
        )
    key = coomba_code_generator.get_key()
    return key


class CoombaCodeField(models.CharField):

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('editable', False)
        kwargs.setdefault('default', get_key)
        kwargs.setdefault('max_length', 30)
        super(CoombaCodeField, self).__init__(*args, **kwargs)

admin.py from django.contrib import admin

from .models import CoombaUser


def full_name(user):
    return (user.first_name + " " + user.last_name)


class CoombaUserAdmin(admin.ModelAdmin):

    list_display = ("email", full_name, "date_joined")
    fieldsets = (
        ("CoombaUser", {
            'fields': (
                "email",
                ("first_name", "last_name"),
                "nickname",
                "coomba_code",
                "social_security_number",
                "gender",
                "date_of_birth",
                "account_status",
                "last_login",
            ),
        }),
    )

admin.site.register(CoombaUser, CoombaUserAdmin)

Error:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/admin/coombaUsers/coombauser/1/

Django Version: 1.6.5
Python Version: 2.7.6
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'core',
 'coombaUsers',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'allauth.socialaccount.providers.google',
 'allauth.socialaccount.providers.linkedin',
 'djangular',
 'localflavor',
 'parsley',
 'crispy_forms',
 'south',
 'django_coverage')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\core\handlers\base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\contrib\admin\options.py" in wrapper
  432.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  99.                     response = view_func(request, *args, **kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
  52.         response = view_func(request, *args, **kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\contrib\admin\sites.py" in inner
  198.             return view(request, *args, **kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\utils\decorators.py" in _wrapper
  29.             return bound_func(*args, **kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  99.                     response = view_func(request, *args, **kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\utils\decorators.py" in bound_func
  25.                 return func(self, *args2, **kwargs2)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\db\transaction.py" in inner
  371.                 return func(*args, **kwargs)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\contrib\admin\options.py" in change_view
  1206.         ModelForm = self.get_form(request, obj)
File "C:\Users\Sverker\.virtualenvs\coomba\lib\site-packages\django\contrib\admin\options.py" in get_form
  531.                              % (e, self.__class__.__name__))

Exception Type: FieldError at /admin/coombaUsers/coombauser/1/
Exception Value: Unknown field(s) (coomba_code) specified for CoombaUser. Check fields/fieldsets/exclude attributes of class CoombaUserAdmin.

Not sure if this will fix your error but why did you define:

def full_name(user):
    ...

outside the:

class CoombaUserAdmin(admin.ModelAdmin):
    ....

how do you pass the user object to full_name()

I would do it like this:

class CoombaUserAdmin(admin.ModelAdmin):
    list_display = ("email", "full_name", "date_joined")

    def full_name(self, obj):
        return u'%s %s' % (obj.first_name, obj.last_name)
    full_name.short_description = "Full Name"    

See https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

Example from the doc:

class PersonAdmin(admin.ModelAdmin):
    list_display = ('upper_case_name',)

    def upper_case_name(self, obj):
        return ("%s %s" % (obj.first_name, obj.last_name)).upper()
    upper_case_name.short_description = 'Name'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM