【问题标题】:Mutiple forms with Class Based View. How to show errors at the same page?具有基于类的视图的多个表单。如何在同一页面显示错误?
【发布时间】:2015-06-26 05:47:43
【问题描述】:

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 %}

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

我怎样才能避免这种情况?我希望所有错误都显示在同一页面上而无需重定向。

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    在您构建它的同一视图上处理表单,否则页面将更改。您可以将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。

    【讨论】:

    • 注意:缺少返回语句,我刚刚修复了它们。
    • 抱歉,回复晚了,但我收到了AttributeError: 'PeopleListView' object has no attribute 'object'
    猜你喜欢
    • 2012-08-07
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2013-01-24
    • 2021-11-01
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多