14

我有一个自定义用户模型如下:

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

6 回答 6

28

经过一番挖掘后,我发现了这个

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

罪魁祸首是clean_usernameinside UserCreationForminside的一个函数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变量。

于 2013-06-06T03:35:58.920 回答
10

姜戈 1.8

如果您的应用尚未使用迁移,那么这也可能是问题所在,因为 contrib.auth 使用了迁移。为我的应用启用迁移为我解决了这个问题。

$ ./manage.py makemigrations <my_app>
$ ./manage.py migrate
于 2015-07-01T11:12:19.987 回答
5

这是由于迁移未运行。通过运行以下命令为我解决了这个问题:

python manage.py syncdb
于 2015-04-14T22:02:04.353 回答
2

首先迁移您的应用程序(具有自定义用户模型的应用程序),然后才是其余的:

$ ./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

于 2017-04-07T16:05:07.060 回答
0

我不得不:

  1. 删除数据库
  2. 创建一个新的数据库
  3. 从所有模型中删除所有迁移
  4. 重新进行迁移
  5. 迁移

这很烦人,因为我必须在本地和远程服务器上进行。我尝试只删除迁移或删除数据库,但随后 git 会推送/拉出旧迁移并将一切搞砸。

PS 这个错误最初是因为我在添加AUTH_USER_MODEL = 'customauth.MyUser'settings.py文件之前运行了迁移,这是不受版本控制的。

于 2019-06-09T03:24:23.313 回答
0

您尚未在数据库中创建管理员。如果您使用的是最新版本的 Django

尝试:

python manage.py makemigrations
python manage.py migrate

如果 auth 表不存在,我对如何获得登录名和密码有点好奇?

最后一个命令为我节省了很多时间

于 2021-07-18T09:09:56.563 回答