基于类视图的多种形式。如何在同一页面上显示错误?

时间:2015-06-26 05:47:44

标签: django django-forms django-views

views.py

from forms.py import PersonCreateForm

class PersonCreateView(CreateView):
    model = Person
    form_class = PersonCreateForm
    template_name = "my_app/create_person.html"

    def form_valid(self, form):
        self.object = form.save()
        return redirect('/homepage/')


class PeopleListView(ListView):
        [...]
        context.update({
            'task_form': TaskCreateForm(),

        return context

在我的模板中,我只需添加处理PersonCreateView的动作URL。

<form action="{% url 'people_create' %}" method="post">{% csrf_token %}

当表格有效时,所有数据都会毫无问题地保存,并将其重定向到&#39; / homepage /。 但是当我的表单无效时,它会将我重定向到{% url 'people_create' %}并在/ homepage / people_create /

中显示错误

我该如何避免?我希望所有错误都显示在同一页面而不重定向。

1 个答案:

答案 0 :(得分:3)

在构建它的同一视图上处理表单,否则页面将会更改。您可以将django.views.generic.edit.ModelFormMixin混合到PeopleListView中,以便它具有您需要的大部分功能。

class PeopleListView(ModelFormMixin, ListView):
    success_url = '/homepage/'  # should use reverse() here

    def get_context_data(self, **kwargs):
        # only add the form if it is not already given to us
        if not 'task_form' in kwargs:
            kwargs['task_form'] = self.get_form()
        return super(PeopleListView, self).get_context_data(**kwargs)

    def post(self, request, *args, **kwargs):
        # ListView won't have a post method, we define one
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)   # default behavior will save and redirect
        else:
            return self.form_invalid(form) # default behavior has to be overridden (see below)

    def form_invalid(self, form):
        # Whatever you wanna do. This example simply reloads the list
        self.object_list = self.get_queryset()
        context = self.get_context_data(task_form=form)
        return self.render_to_response(context)

在那里,您有三个代码路径:

  • 初始显示将照常加载列表视图,只会将空表单添加到上下文中。
  • 在提交有效输入时,会调用form_valid方法,该方法将重定向到/homepage/
  • 在提交无效输入时,我们会调用我们重写的form_invalid方法,这将正常呈现页面,但表单将包含验证错误。

你可以使用表单的缓存属性使整个事情变得更加明确,但是你开始反对Django发布的视图而不是使用它,并且可能只是使用基本View类并自己实现所有逻辑。我坚持使用Django的观点,但是ymmv。