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

Django用户信息编辑表单显示不可编辑文本问题求助

问题原因

Django自带的UserChangeForm是为后台管理员设计的表单,默认会包含用户模型的所有字段,并且其中多个核心字段(如用户名、创建时间等)被设置为只读状态,所以前端渲染后会显示成不可编辑的普通文本,而非可输入的表单控件。

解决方案

自定义一个适合普通用户编辑个人资料的表单,只保留需要修改的字段,并确保字段可编辑。

步骤1:创建自定义表单

在你的应用目录下新建/编辑forms.py,添加以下代码:

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

# 自定义用户资料编辑表单
class EditProfileForm(forms.ModelForm):
    class Meta:
        model = User
        # 指定允许用户编辑的字段,按需调整
        fields = ('username', 'first_name', 'last_name', 'email')

如果想基于UserChangeForm调整,也可以用以下代码:

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

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email')
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 移除字段的只读属性
        for field in self.fields:
            self.fields[field].widget.attrs.pop('readonly', None)

步骤2:修改视图函数

更新views.py中的edit_profile函数,替换原来的UserChangeForm为自定义表单:

from .forms import EditProfileForm  # 导入自定义的表单

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('/Nornik/profile')
    else:
        form = EditProfileForm(instance=request.user)
        args = {'form': form}
        return render(request, 'Nornik/edit_profile.html', args)

步骤3:保持模板不变

你的edit_profile.html模板无需修改,{{ form.as_p }}会自动渲染出可编辑的表单控件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:16