Пользовательская модель 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)

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

$ ./manage.py makemigrations 
$ ./manage.py migrate
$ ./manage.py makemigrations
$ ./manage.py migrate

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

Решение Вопроса

После некоторого копания я нашел это

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'])

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 переменная.

 Gavriel Cohen27 авг. 2017 г., 15:28
Первая ссылка, которую вы привели, не работает
 Charlesliam19 янв. 2014 г., 14:28
Просто решение, которое яищу
 Ludo31 янв. 2014 г., 11:58
Спасибо! Только одна маленькая вещь, в вашем примере кода отсутствует импорт: из форм импорта django.contrib.auth
 Joe J11 февр. 2015 г., 19:50
Это здорово - спасибо!
 eneepo29 янв. 2014 г., 09:34
Это спасло мой день!
 James Lin02 февр. 2014 г., 20:58
@ Людо спасибо, добавил это.
 dustinfarris02 окт. 2013 г., 16:13
Хорошо поймал. Это определенно следует учитывать, учитывая, что документы Django фактически побуждают вас использовать эти классы прямо из коробки, когда вы расширяете модель User.

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

python manage.py syncdb

Джанго 1,8

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

$ ./manage.py makemigrations 
$ ./manage.py migrate
 Nelo Mitranim05 авг. 2015 г., 17:42
Вы сохранили мое здравомыслие. По-видимому, если вы стираете миграции, вам нужно сохранить папку миграции и__init__.py в нем иначе Django не сможет создать начальную миграцию, а впоследствии потерпит неудачу.migrate

Ваш ответ на вопрос