管理员中的Django自定义用户模型,关系“auth_user”不存在 [英] Django custom user model in admin, relation "auth_user" does not exist

查看:1527
本文介绍了管理员中的Django自定义用户模型,关系“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)

编辑用户记录工作正常,但是当我添加一个用户时,我收到以下错误

 异常值:
关系auth_user不存在
LINE 1:... user。is_active,auth_user。date_joinedFROMauth_user ...


解决方案

在一些挖掘之后,我发现这个



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):
#由于User.username是唯一的,此检查是多余的,
#,但它设置比ORM更好的错误消息。见#13147。
username = self.cleaned_data [username]
try:
User._default_manager.get(username = username)
除了User.DoesNotExist:
return username
raise forms.ValidationError(self.error_messages ['duplic_username'])

用户在此文件中直接引用内置用户模型。



要修复它,我创建了我的自定义表单

 从模型导入用户#您可以使用django.contrib.auth.forms中的get_user_model 
从django导入UserCreationForm
.contrib.auth.admin导入来自django.contrib.auth的UserAdmin
导入表单

class MyUserCreationForm(UserCreationForm):
def clean_username(self):
#Since User.username是唯一的,此检查是多余的,
#但它设置比ORM更好的错误消息。见#13147。
username = self.cleaned_data [username]
try:
User._default_manager.get(username = username)
除了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 变量。 / p>

I have a custom user model as below:

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)

And using the builtin UserAdmin

admin.site.register(User, UserAdmin)

While editing the user record works fine, but when I add a user, I get the following error

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

解决方案

After some digging around I found this

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

The culprit is a function clean_username inside UserCreationForm inside django.contrib.auth.forms.py. A few tickets have been created, but apparently the maintainers don't think it's a defect:

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 in this file is directly referencing to the builtin user model.

To fix it, I created my custom forms

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)

Or you can try monkey patching the original UserCreationForm to replace the User variable.

这篇关于管理员中的Django自定义用户模型,关系“auth_user”不存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆