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

Django管理员重置用户密码报错‘用户名已存在’问题求助

解决Django管理员重置用户密码时提示"A user with that username already exists."的问题

问题根源

你使用的UserCreationForm是Django专门用于创建新用户的表单,它默认对username字段做「唯一性校验」——即使你传入了要修改的用户实例,表单验证时仍会检查数据库中是否存在相同用户名,而目标用户本身已存在,因此触发该错误。


解决方案(两种可选)

方案一:改用Django内置的管理员重置密码表单(推荐)

Django提供了专门用于管理员重置用户密码的SetPasswordForm,它无需处理用户名,也不会触发用户名唯一性校验,直接适配场景:

修改form.py

from django.contrib.auth.forms import SetPasswordForm
from django import forms

class AdminSetPasswordForm(SetPasswordForm):
    class Meta:
        model = User
        fields = ["new_password1", "new_password2"]
    
    # 自定义表单样式(可选)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['new_password1'].widget.attrs.update({'class':'form-control','placeholder':'新密码'})
        self.fields['new_password2'].widget.attrs.update({'class':'form-control','placeholder':'确认新密码'})

修改view.py

from django.contrib.auth.forms import SetPasswordForm
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.models import User
from django.contrib import messages
from django.shortcuts import render, HttpResponseRedirect, get_object_or_404
from django.contrib.auth.decorators import login_required

@login_required(login_url='/')
def UserChangePassword(request,pk):
    user = get_object_or_404(User, id=pk)
    user_id = request.user
    heading_name = "user"
    rights, main_heading, page_menu, form_btn_data = RightLoader(user_id, heading_name)
    
    try:
        auth_check = rights.form_btn.get(heading_name=heading_name, btn_type="Password")
        if request.method == 'POST':
            form = AdminSetPasswordForm(user, request.POST)
            if form.is_valid():
                updated_user = form.save()
                # 可选:更新session避免用户登录失效(如果是用户自改密码建议保留)
                update_session_auth_hash(request, updated_user)
                messages.success(request, '密码修改成功!')
            else:
                messages.error(request, str(form.errors))
        else:
            form = AdminSetPasswordForm(user)
        
        context = {
            'form':form,
            'page_menu':page_menu,  
            'main_heading':main_heading,
            'btn_type':'fa fa-regular fa-plus',
            'title':'iCateen | User',
            'page_title':'密码修改',
            'tree_title_1':'用户',
            'tree_url':'user',
            'tree_title_2':'修改密码',
            'view':'yes',
        }
        return render(request, 'base/user/change_password.html',context)
    except:
        return HttpResponseRedirect("/")

方案二:修改自定义表单,移除用户名唯一性校验

如果坚持使用自定义表单,需重写clean_username方法跳过校验:

修改form.py

from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User

class PasswordChange_Form(UserCreationForm):
    class Meta:
        model = User
        fields = ["username","password1","password2"]
        widgets = {
                "username":forms.TextInput(attrs={'class':'form-control','placeholder':'Username', 'readonly':'readonly'}),
                "password1":forms.TextInput(attrs={'class':'form-control',"placeholder":"Password"}),
                "password2":forms.TextInput(attrs={'class':'form-control','placeholder':'Confirm Password'}),
        }
    
    # 重写校验逻辑,直接返回当前用户的用户名,跳过唯一性检查
    def clean_username(self):
        return self.instance.username

view.py代码可保留原逻辑,此时表单验证时不会再触发用户名重复的错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:25:31