Django updateview表单验证错误未在模板中显示

时间:2014-08-20 04:27:40

标签: python django django-forms django-views

我在 views.py

中有更新视图
class UserProfileUpdateView(LoginRequiredMixin, UpdateView):
    model = UserProfile
    template_name = 'my-account/my_profile_update.html'
    form_class = UserProfileUpdateForm

    def get_context_data(self, **kwargs):

        context = super(UserProfileUpdateView, self).get_context_data(**kwargs)
        context['form'] = UserProfileUpdateForm(instance=UserProfile.objects.get(user=self.request.user))
        return context

    def get_object(self):
        return get_object_or_404(UserProfile, user=self.request.user)

forms.py

class UserProfileUpdateForm(forms.ModelForm):

    username = forms.CharField(label='Username')
    video = forms.URLField(required=False, label='Profile Video')

    def clean_username(self):
        username = self.cleaned_data['username']
        if UserProfile.objects.filter(username=username).exists():
            print "This print is working"
            raise forms.ValidationError('Username already exists.')
        return username 

    class Meta:     
        model = UserProfile

但是在模板中表示错误不显示

在模板home.html中

{{ form.username.errors }}

输入现有用户验证并引发错误但未在form.username.errors中显示。我尝试打印表单,但没有在表单上找到错误。这是updateview的问题吗?

提前致谢..

2 个答案:

答案 0 :(得分:1)

更新视图已在上下文中包含表单。但是,在get_context_data方法中,您要用

替换表单
    context['form'] = UserProfileUpdateForm(instance=UserProfile.objects.get(user=self.request.user))

此表单不受发布数据约束,因此它永远不会有任何错误。

您不应该包含此行。您的get_object方法应该足以确保您的视图使用正确的用户。

答案 1 :(得分:0)

在您的情况下,UserProfileUpdateForm已与UserProfile绑定,因此您无需更改context数据。

但是,在尝试按照doc向表单提供一些初始值时,我遇到了完全相同的问题。所以在get_context_data,我有

context['form'] = self.form_class(instance=self.post, initial={"tags":",".join([tag.name for tag in self.post.tags.all()])})

这将预填充form.tags,其中包含与以逗号分隔的帖子相关联的标记列表。

我潜入UpdateView的{​​{1}}之后设法解决了这个问题。在第81行,他们有

def form_invalid(self, form):
    """
    If the form is invalid, re-render the context data with the
    data-filled form and errors.
    """
    return self.render_to_response(self.get_context_data(form=form))

如果表单无效且包含错误,则会使用绑定表单调用get_context_data。我必须将此表单传递给模板,而不是我在get_context_data方法中指定的表单。 为了实现这一目标,我们需要对get_context_data进行一些更改。

def get_context_data(self, **kwargs):
    context = super(PostUpdate, self).get_context_data(**kwargs)
    if 'form' in kwargs and kwargs['form'].errors:
        return context
    else:
        context['form'] = self.form_class(instance=self.post, initial={"tags":",".join([tag.name for tag in self.post.tags.all()])})
        return context

如果表单中包含错误,则会将其直接传递给模板。否则使用我们提供的那个。

我相信还有其他解决方案。如果你有,请发布。它将帮助其他人学习Django。