0

我正在尝试将以下基于函数的视图转换为基于类的视图:

(基本上在表单提交有效或无效之后,用户会再次被重定向到同一页面)。

旧代码:

def handle_form(request, template_name='contact.html'):
    if request.method == "POST":
        form = ContactForm(request.POST)
        if form.is_valid():
            do_something()
    else:
        form = ContactForm()
    return render_to_response(template_name, {'form': form}, context_instance=RequestContext(request))

新代码:

class ContactFormView(FormView):
    template_name = 'contact.html'
    form_class = ContactForm
    success_url = reverse_lazy('contact')

    def form_valid(self, form):
        do_something()
        return super(ContactFormView, self).form_valid(form)

新代码的细微差别在于,如果表单有效,表单的提交值将被遗忘。旧代码中的行为是始终记住这些值。

任何帮助,将不胜感激。

干杯

4

2 回答 2

1

FormView 实现了表单的标准流程,即在成功保存后不再重新显示填充的表单。

要执行您想要的操作,您必须自己保存表单,然后使用传递给它的上下文再次渲染视图,而不是依赖超类方法来执行此操作。

class ContactFormView(FormView):
    template_name = 'contact.html'
    form_class = ContactForm

    def form_valid(self, form):
        do_something()
        form.save()
        return self.render_to_response(self.get_context_data(form=form))
于 2013-01-24T05:11:22.020 回答
0

form_valid 将执行重定向,而不是呈现模板。您需要放弃默认行为并像往常一样呈现模板(我假设您没有保存模型,否则您应该简单地重定向到 url

于 2013-01-23T20:41:48.343 回答