使用带有django allauth的自定义用户模型时出现错误,无法解析关键字';用户名';到田野里去。选项包括:活动历史记录、应用程序、。。。。,

使用带有django allauth的自定义用户模型时出现错误,无法解析关键字';用户名';到田野里去。选项包括:活动历史记录、应用程序、。。。。,,django,django-allauth,Django,Django Allauth,我试图集成django allauth,并尝试使用自定义用户模型。如上所述,我创建了我的模型 class Client(AbstractBaseUser): fname = models.CharField(max_length=50) lname = models.CharField(max_length=50) email = models.EmailField(max_length=150, unique=True, db_index=True) creat

我试图集成django allauth,并尝试使用自定义用户模型。如上所述,我创建了我的模型

class Client(AbstractBaseUser):
    fname = models.CharField(max_length=50)
    lname = models.CharField(max_length=50)
    email = models.EmailField(max_length=150, unique=True, db_index=True)
    created_at = models.DateTimeField(auto_now_add=True)
    state_choices = (
        (0, 'Pending'),
        (1, 'Active'),
        (2, 'Deleted'),
        (3, 'Banned'),
    )
    state = models.SmallIntegerField(choices=state_choices, default=1, editable=False)
    objects = ClientManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['fname', 'lname']
    def save(self, *args, **kwargs):
        #########
    def get_short_name(self):
        return self.fname

    def get_full_name(self):
        return '%s %s' % (self.fname, self.lname)

    def has_perm(self, perm, obj=None):
        ###########

    def has_module_perms(self, app_label):
        ###########

    @property
    def is_staff(self):
        ###########
经理呢

class ClientManager(BaseUserManager):
    def create_user(self, fname, lname, email, created_at, state):
        user = self.model(fname=fname, lname=lname, email=email, created_at=created_at, state=state)
        return user

    def create_superuser(self, fname, lname, email, created_at, state):
        user = self.create_user(fname=fname, lname=lname, email=email, created_at=created_at, state=state)
        user.is_team_player = True
        user.save()
        return user
现在,对于
admin.py
我做了

class UserCreationForm(forms.ModelForm):
    #A form for creating new users
    class Meta:
        model = models.Client
        fields = ('fname', 'lname', 'email')


class UserChangeForm(forms.ModelForm):
    #A form for updating users
    class Meta:
        model = models.Client
        fields = ['fname', 'lname', 'email', 'is_admin']

class ClientAdmin(UserAdmin):
    # The forms to add and change user instances
    form = UserChangeForm
    add_form = UserCreationForm

    list_display = ('email', 'is_admin')
    list_filter = ('is_admin',)

    fieldsets = (
    (None, {'fields': ('email', )}),
    ('Personal info', {'fields': ('fname', 'lname')}),
    ('Permissions', {'fields': ('is_admin',)}),
    )  

    add_fieldsets = (
    (None, {
        'classes': ('wide',),
        'fields': ('email', 'fname', 'lname')}
    ),
)

    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()




admin.site.unregister(models.Client)
admin.site.register(models.Client, ClientAdmin)
admin.site.unregister(Group)
settings.py
中,我添加了
AUTH\u USER\u MODEL='app.Client'

现在,当我转到
/admin
时,它会告诉我错误

ImproperlyConfigured at /admin
Cannot resolve keyword 'username' into field. Choices are: activityhistory, app, created_at, email, emailaddress, fname, id, is_active, is_admin, last_login, lname, logentry, password, socialaccount, state, testdevice
堆栈跟踪告诉我,由于它将
电子邮件
视为用户名,并且我使用
用户名
密码
进行登录,因此会出现此错误。我不能让django只对管理员忽略这个限制,或者我可以将管理员的登录机制更改为使用电子邮件而不是用户名吗


我试图使用
django allauth
让用户通过谷歌登录,或者使用他的电子邮件和密码注册。但到目前为止,这对我来说是一段艰难的旅程。如果以前有人这样做过,或者知道如何轻松地做到这一点,请给我指点参考资料将非常棒。

首先,将此添加到您的自定义用户模型中:

class Client(AbstractBaseUser):
   class Meta:
      swappable = 'AUTH_USER_MODEL'
此外,请将其添加到settings.py文件:

ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
从文档中:

(…)如果自定义用户模型没有用户名字段(再次, 为了避免与电子邮件地址或用户id弄错),您需要 要将帐户\用户\模型\用户名\字段设置为无。这将禁用 allauth中与用户名相关的功能

这对我很管用

参考资料:

[1]

[2]