Django-allauth W001警告排查:自定义用户模型(邮箱为USERNAME_FIELD)配置冲突
Django-allauth + dj-rest-auth 认证配置警告问题解答
问题背景
开发Django项目时使用django-allauth和dj-rest-auth做认证,已自定义CustomUser模型,将email设为USERNAME_FIELD,username设为None。系统检查持续出现警告:
?: (account.W001) ACCOUNT_LOGIN_METHODS conflicts with ACCOUNT_SIGNUP_FIELDS
尝试多种配置组合后警告仍未消除,应用功能正常但需修正配置确保正确性。
相关代码
models.py(users应用)
from django.contrib.auth.models import AbstractUser from django.db import models from .managers import CustomUserManager class CustomUser(AbstractUser): username = None email = models.EmailField(unique=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] objects = CustomUserManager() def __str__(self): return self.email
settings.py(allauth/dj-rest-auth相关配置)
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES':( 'rest_framework_simplejwt.authentication.JWTAuthentication', 'dj_rest_auth.jwt_auth.JWTCookieAuthentication', ) } AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend', ] ACCOUNT_USER_MODEL_USERNAME_FIELD = None ACCOUNT_LOGIN_METHODS = {'email'} ACCOUNT_SIGNUP_FIELDS = ['email','password'] ACCOUNT_EMAIL_VERIFICATION = 'none'
serializers.py
from rest_framework import serializers from .models import CustomUser class RegisterSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) password2 = serializers.CharField(write_only=True, label="Confirm Password") class Meta: model = CustomUser fields = ['email', 'first_name', 'last_name','password', 'password2'] def validate(self, attrs): if attrs['password'] != attrs['password2']: raise serializers.ValidationError({"password": "Your passwords didn't match."}) return attrs def create(self, validated_data): validated_data.pop('password2') user = CustomUser.objects.create_user(**validated_data) return user
完整警告输出
/home/roni/Desktop/FitCore/env/lib/python3.12/site-packages/dj_rest_auth/registration/serializers.py:228: UserWarning: app_settings.USERNAME_REQUIRED is deprecated, use: app_settings.SIGNUP_FIELDS['username']['required'] required=allauth_account_settings.USERNAME_REQUIRED, /home/roni/Desktop/FitCore/env/lib/python3.12/site-packages/dj_rest_auth/registration/serializers.py:230: UserWarning: app_settings.EMAIL_REQUIRED is deprecated, use: app_settings.SIGNUP_FIELDS['email']['required'] email = serializers.EmailField(required=allauth_account_settings.EMAIL_REQUIRED) /home/roni/Desktop/FitCore/env/lib/python3.12/site-packages/dj_rest_auth/registration/serializers.py:288: UserWarning: app_settings.EMAIL_REQUIRED is deprecated, use: app_settings.SIGNUP_FIELDS['email']['required'] email = serializers.EmailField(required=allauth_account_settings.EMAIL_REQUIRED) System check identified some issues: WARNINGS: ?: (account.W001) ACCOUNT_LOGIN_METHODS conflicts with ACCOUNT_SIGNUP_FIELDS System check identified 1 issue (0 silenced). May 28, 2025 - 16:33:56 Django version 5.2.1, using settings 'fitcore.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
环境信息
- Django 5.2.1
- Python 3.12.x
- django-allauth 65.8.1
- dj-rest-auth 7.0.1
已尝试操作
- 设置
ACCOUNT_SIGNUP_FIELDS为['email']或['email','password'] - 确保
ACCOUNT_USER_MODEL_USERNAME_FIELD=None、ACCOUNT_LOGIN_METHODS=('email',) - 移除已弃用的allauth配置
问题解答
1. 为何尝试配置后仍出现W001警告?
核心原因有两个:
- 当
USERNAME_FIELD设为email且ACCOUNT_USER_MODEL_USERNAME_FIELD=None时,django-allauth会自动推导登录方式为email,此时手动设置ACCOUNT_LOGIN_METHODS={'email'}会和内置逻辑冲突,触发警告。 ACCOUNT_SIGNUP_FIELDS的配置错误:该配置仅用于指定用户注册时需要填写的非USERNAME_FIELD、非密码的额外字段,你把email(USERNAME_FIELD)和password(认证流程自带字段)加入其中,违背了该配置的设计逻辑,进一步加剧了冲突。
2. 邮箱作为主标识时的标准正确配置
针对你的自定义用户模型,正确的allauth配置应该是:
ACCOUNT_USER_MODEL_USERNAME_FIELD = None ACCOUNT_USERNAME_REQUIRED = False # 显式设置,避免自动推导歧义 ACCOUNT_LOGIN_METHODS = ('email',) # 可选,allauth会自动识别USERNAME_FIELD为email,可省略此配置 ACCOUNT_SIGNUP_FIELDS = ['first_name', 'last_name'] # 仅包含注册时需要用户填写的额外字段 ACCOUNT_EMAIL_VERIFICATION = 'none'
说明:
- 无需手动指定
ACCOUNT_LOGIN_METHODS,allauth会根据USERNAME_FIELD自动设置登录方式为email ACCOUNT_SIGNUP_FIELDS仅包含你的序列化器中用到的first_name、last_name,因为email是USERNAME_FIELD会自动作为注册必填项,password由认证流程处理,不需要加入该配置
3. 自定义RegisterSerializer是否会导致冲突?
不会。W001警告来自django-allauth的系统检查逻辑,和dj-rest-auth的自定义序列化器无关。不过需要注意:
- 序列化器中包含的
first_name、last_name需要和ACCOUNT_SIGNUP_FIELDS配置保持一致,确保注册流程和allauth配置匹配 - 你收到的dj-rest-auth弃用警告是因为该库尚未完全适配django-allauth的新配置格式,可暂时忽略,或等待dj-rest-auth版本更新解决。
内容的提问来源于stack exchange,提问作者Md Roni Ahamed
相关产品推荐
相关产品推荐

