我有一个自定义用户模型如下:
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...
答案 0 :(得分:27)
经过一番挖掘,我发现了这个
罪魁祸首是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
变量。
答案 1 :(得分:5)
这是由于迁移未运行。通过运行以下命令解决了此问题:
python manage.py syncdb
答案 2 :(得分:5)
Django 1.8
如果您的应用尚未使用迁移,那么这也可能是问题,因为contrib.auth使用它们。为我的应用启用迁移为我解决了这个问题。
$ ./manage.py makemigrations <my_app>
$ ./manage.py migrate
答案 3 :(得分:1)
首先迁移您的应用程序(具有自定义用户模型的应用程序),然后仅迁移其余部分:
$ ./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
答案 4 :(得分:0)
我必须:
这很烦人,因为我必须在本地和远程服务器上执行此操作。我尝试仅删除迁移或删除数据库,但是git会推/拉旧迁移并将所有内容弄乱。
P.S。最初出现此错误是因为我在将AUTH_USER_MODEL = 'customauth.MyUser'
添加到不受版本控制的settings.py
文件之前运行了迁移。
答案 5 :(得分:0)
您尚未在数据库中创建管理员。如果您使用的是最新版本的 Django
试试:
python manage.py makemigrations
python manage.py migrate
有点好奇,如果身份验证表不存在,您如何获得登录名和密码?
最后一个命令为我节省了很多时间