You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django后台登录失败及CSRF令牌错误问题求助

问题排查与解决方案

一、解决Admin登录“账号密码不正确”问题

1. 检查用户密码存储方式

Django的User模型密码需要哈希存储,直接给password字段赋值明文会导致验证失败。在表单的save方法中必须使用set_password:

# forms.py示例
from django.contrib.auth.forms import UserCreationForm
from .models import Profile, User

class ProfileForm(UserCreationForm):
    # 你的表单字段
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

    def save(self, commit=True):
        user = super().save(commit=False)
        # 必须用set_password哈希密码
        user.set_password(self.cleaned_data['password1'])
        # 必须开启is_staff才能登录Admin
        user.is_staff = True
        if commit:
            user.save()
            # 关联创建Profile(如果信号没生效可手动创建)
            Profile.objects.create(user=user)
        return user

2. 验证用户权限与密码有效性

通过Django Shell确认用户状态:

python manage.py shell

执行以下代码:

from django.contrib.auth.models import User
# 替换成你的用户名
user = User.objects.get(username="test_user")
# 检查是否允许登录Admin
print(user.is_staff)  # 必须返回True
# 检查密码是否匹配
print(user.check_password("你的密码"))  # 返回True说明密码正确

如果is_staff为False,执行:

user.is_staff = True
user.save()

3. 确认信号逻辑正确

  • 确保signals.py的信号接收器正确关联User的post_save信号:
# signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()
  • 在apps.py中注册信号,确保Django启动时加载:
# apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'your_app'

    def ready(self):
        import your_app.signals
  • 确保settings.py的INSTALLED_APPS中是你的AppConfig而非直接写App名称:
INSTALLED_APPS = [
    # ...
    'your_app.apps.YourAppConfig',
    # ...
]

二、解决CSRF令牌错误问题

1. 确认模板包含CSRF标签

在profile_form.html的POST表单中必须添加{% csrf_token %}:

<!-- profile_form.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

2. 检查Settings.py的CSRF配置

  • 确保中间件包含CSRF中间件,且顺序正确:
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 必须存在且顺序正确
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  • 开发环境下关闭HTTPS强制Cookie:
# settings.py
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False
  • 添加信任的源:
CSRF_TRUSTED_ORIGINS = ['http://127.0.0.1:8000']

3. 避免重复提交导致的错误

刷新登录页面出现CSRF错误是正常现象——因为刷新会重复发送之前的POST请求,此时令牌已失效。只需返回登录页面重新输入即可。

内容的提问来源于stack exchange,提问作者as666123456

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:11:23