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

Her*_*ere 5 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
Run Code Online (Sandbox Code Playgroud)

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

<form action="{% url 'people_create' %}" method="post">{% csrf_token %}
Run Code Online (Sandbox Code Playgroud)

当Form有效时,所有数据都保存没有问题,并将其重定向到'/ homepage /.但是当我的表单无效时,它会将我重定向到{% url 'people_create' %}并在/ homepage/people_create /中显示错误

我怎么能避免这种情况?我希望所有错误显示在同一页面而不重定向.

spe*_*ras 4

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

\n\n
class PeopleListView(ModelFormMixin, ListView):\n    success_url = '/homepage/'  #\xc2\xa0should use reverse() here\n\n    def get_context_data(self, **kwargs):\n        # only add the form if it is not already given to us\n        if not 'task_form' in kwargs:\n            kwargs['task_form'] = self.get_form()\n        return super(PeopleListView, self).get_context_data(**kwargs)\n\n    def post(self, request, *args, **kwargs):\n        # ListView won't have a post method, we define one\n        form = self.get_form()\n        if form.is_valid():\n            return self.form_valid(form)   # default behavior will save and redirect\n        else:\n            return self.form_invalid(form) # default behavior has to be overridden (see below)\n\n    def form_invalid(self, form):\n        # Whatever you wanna do. This example simply reloads the list\n        self.object_list = self.get_queryset()\n        context = self.get_context_data(task_form=form)\n        return self.render_to_response(context)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

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

您可以使用表单的缓存属性使整个事情变得更加简单,但随后您将开始针对 Django 提供的视图而不是使用它,并且也可能只使用基本类View并自己实现所有逻辑。我会坚持 Django 的观点,但是 ymmv。

\n