Пользовательская модель Django в admin, отношение "auth user" не существует

у меня есть пользовательская модель пользователя, как показано ниже:

class User(AbstractUser):
    subscribe_newsletters = models.BooleanField(default=True)
    old_id = models.IntegerField(null=True, blank=True)
    old_source = models.CharField(max_length=25, null=True, blank=True)

и используя встроенный UserAdmin

admin.site.register(User, UserAdmin)

при редактировании записи пользователя работает нормально, но когда я добавляю пользователя, я получаю следующую ошибку

Exception Value: 
relation "auth_user" does not exist
LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...

4 ответов


после некоторых раскопок я нашел это

https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms

виновником является функция clean_username внутри UserCreationForm внутри django.contrib.auth.forms.py. Было создано несколько билетов, но, по-видимому, сопровождающие не думают, что это дефект:

https://code.djangoproject.com/ticket/20188

https://code.djangoproject.com/ticket/20086

def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        try:
            User._default_manager.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])

The User в этом файле непосредственно ссылается на встроенную модель пользователя.

чтобы исправить это, я создал свой пользовательские формы

from models import User #you can use get_user_model
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth import forms

class MyUserCreationForm(UserCreationForm):
    def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        try:
            User._default_manager.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])

    class Meta(UserCreationForm.Meta):
        model = User

class MyUserAdmin(UserAdmin):  
    add_form = MyUserCreationForm   

admin.site.register(User,MyUserAdmin)

или вы можете попробовать обезьяна латать оригинал UserCreationForm заменить User переменной.


Это связано с тем, что миграция не выполняется. Эта проблема решена для меня, выполнив следующую команду:

python manage.py syncdb


Джанго 1.8

Если ваше приложение еще не использует миграции, это также может быть проблемой, как contrib.двиг использует их. Включение миграции для моего приложения решило это для меня.

$ ./manage.py makemigrations <my_app>
$ ./manage.py migrate

сначала перенесите приложение (с пользовательской моделью пользователя), а затем все остальное:

$ ./manage.py makemigrations <your_app>
$ ./manage.py migrate
$ ./manage.py makemigrations
$ ./manage.py migrate

вы также можете контролировать порядок миграций, чтобы убедиться, что это происходит автоматически, см. https://docs.djangoproject.com/en/1.10/howto/writing-migrations/#controlling-the-order-of-migrations