预填充Django 2表单报错:‘str’对象没有‘get’属性
解决Django UpdateProfile表单预填充及提交报错问题
嘿,我瞅到你代码里的问题啦!最后一行render函数里的args是个未定义的变量,这绝对是触发那个widget相关错误的元凶!
先给你修正后的完整视图代码:
def update_profile(request): if request.method == 'POST': form = UpdateProfile(request.POST, instance=request.user.userprofile) if form.is_valid(): form.save() return redirect('index') else: form = UpdateProfile(instance=request.user.userprofile) # 这里把未定义的args改成传递form的上下文字典 return render(request, 'update_profile.html', {'form': form})
为啥之前会报错?
Django的render函数第三个参数需要是上下文字典,用来把视图里的变量传递给模板。你之前写的args根本没定义,导致模板里渲染表单时拿不到form实例,表单组件(widget)没法正确读取数据,才触发了value_from_datadict的错误。
额外要确认的几点:
- 确保你的
UpdateProfile表单是正确继承ModelForm并关联了UserProfile模型的,比如:
from django import forms from .models import UserProfile class UpdateProfile(forms.ModelForm): class Meta: model = UserProfile fields = ['bio', 'avatar', 'location'] # 换成你的实际字段
- 要保证
request.user.userprofile确实存在——比如你有没有用信号在创建User时自动生成关联的UserProfile?不然GET请求初始化表单时会直接报错。 - 模板
update_profile.html里要正确渲染表单,别漏了CSRF令牌:
<form method="POST"> {% csrf_token %} {{ form.as_p }} <button type="submit">更新资料</button> </form>
内容的提问来源于stack exchange,提问作者DarkCoderRises
相关产品推荐
相关产品推荐

