Пользовательская модель 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 ответов
после некоторых раскопок я нашел это
виновником является функция 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