django - 表单错误未显示在 UpdateView 中
问题描述
我有一个 UpdateView,它将显示一个表单来创建用户配置文件或更新用户配置文件。它运作良好,但是,由于某种原因,我无法让它显示表单错误。根据ValidationErrors
我在模型表格中输入的内容,应该存在表格错误。我怀疑我的 views.py 是表单不显示错误的原因。
这是我的看法:
class ProfileSettings(UpdateView):
model = Profile
template_name = 'profile/settings.html'
form_class = ProfileForm
success_url = reverse_lazy('profile:settings')
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request.FILES)
if form.is_valid():
bio = form.cleaned_data['bio']
gender = form.cleaned_data['gender']
avatar = form.cleaned_data['avatar']
Profile.objects.update_or_create(user=self.request.user, defaults={'avatar':avatar, 'bio':bio, 'gender':gender})
return HttpResponseRedirect(self.success_url)
在模板中,我正在显示如下错误:{{ form.avatar.errors }}
如果图像太小,头像应该显示错误,但事实并非如此。
解决方案
在这里,您不会将表单错误返回到模板。我认为你可以这样处理(覆盖form_valid
而不是post
方法):
class ProfileSettings(UpdateView):
model = Profile
template_name = 'profile/settings.html'
form_class = ProfileForm
success_url = reverse_lazy('profile:settings')
def form_valid(self, form):
bio = form.cleaned_data['bio']
gender = form.cleaned_data['gender']
avatar = form.cleaned_data['avatar']
Profile.objects.update_or_create(user=self.request.user, defaults={'avatar':avatar, 'bio':bio, 'gender':gender})
return HttpResponseRedirect(self.success_url)
顺便说一句,这段代码也有一些缺陷。我们在save
这里不使用模型形式。如果我们可以使用它,那将是最好的。form_valid
原来是这样做的。
另外一点,我认为最好在创建用户时使用信号来创建用户配置文件。这是一篇关于如何做到这一点的中等帖子。这样,您甚至不需要覆盖form_valid
.
更新
使用 FormView 预填充数据:
class ProfileSettings(FormView):
model = Profile
template_name = 'profile/settings.html'
form_class = ProfileForm
success_url = reverse_lazy('profile:settings')
def get_form_kwargs(self):
kwargs = super(ProfileSettings, self).get_form_kwargs()
kwargs['instance'] = self.request.user.profile # Profile object
return kwargs
推荐阅读
- java - 我无法映射此 SQLite 查询的结果。在java中可以做到这一点吗?
- python - scipy.stats rankdata:错误“rankdata()得到了一个意外的关键字参数'axis'”
- r - 我想将每个类别的计数百分比作为标签添加到我的 ggplot 饼图
- python - 在 Python 中强制转换构造函数
- javascript - blazor 中未定义的函数
- c# - 尝试更改集合中的元素
- java - Experiment.java:18:错误:表达式的非法开始
- go - GStreamer appsrc 不会向 autoaudiosink 播放音频
- php - 未知:在第 0 行的未知中打开失败需要 '...\Desktop\grupo6-redSocialLaravel\MyFuture\server.php' (include_path='.;C:\php\pear')
- python - 有没有办法使用 Selenium 绕过 Java?(提高下载速度)