【问题标题】:Form errors not displaying in UpdateView表单错误未显示在 UpdateView 中
【发布时间】:2019-06-26 16:15:03
【问题描述】:

我有一个 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 }} 如果图像太小,头像应该显示错误,但它没有。

【问题讨论】:

  • 向我们展示forms.py。您还在模板中呈现表单吗?

标签: django django-models django-forms django-templates django-views


【解决方案1】:

在这里,您不会将表单错误返回到模板。我认为您可以这样处理(覆盖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 原本就是这样做的。

另外,我认为最好在创建用户时使用signals 创建用户配置文件。这是关于如何做到这一点的medium post。这样,您甚至不需要覆盖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

【讨论】:

  • 我会看看那篇文章,但是对于你的代码,我收到了这个错误:Generic detail view ProfileSettings must be called with either an object pk or a slug.
  • 通常需要使用路径your_url/<int:pk>/your_url/<slug>/调用UpdateView。如果您不打算以这种方式使用,请考虑改用FormView
  • 我不打算那样使用它,但是我保留UpdateView的原因是因为它可以在访问表单时显示用户的数据。 FormView 不这样做
  • FormView 中也可以获取表单数据。请查看我的更新答案
  • 这很好用,但在get_form_kwargs 中,如果配置文件不存在,是否可以返回空白表单。现在,它返回一个RelatedObjectDoesNotExist 错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2012-04-05
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2017-10-20
相关资源
最近更新 更多