将表单数据从视图发送到模板

时间:2012-10-03 21:17:00

标签: python django django-forms django-templates django-views

修改
我希望'success_url'(即result.html)显示'form.process()'中的'data'。以下代码显然不起作用。 任何人都可以告诉我它有什么问题或建议另一种方法来基本上查看模板中的上下文“数据”(以列表或字典的形式),即在表单形式之后向用户显示数据的更好方法提交。
非常感谢提前。

-- urls.py --
url(r'^$', view='main_view'),
url(r'^result/$', view='result_view'),

-- views.py --
class ResultView(TemplateView):
    template_name = "result.html"

class MainView(FormView):
    template_name = 'index.html'
    form_class = UserInputForm
    success_url = 'result/'

    def form_valid(self, form):
        data = form.process()
        return super(MainView, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(MainView, self).get_context_data(**kwargs)
        context['data'] = data
        return context

main_view = MainView.as_view()
result_view = ResultView.as_view()

4 个答案:

答案 0 :(得分:9)

据我了解您的问题,您希望在结果视图中显示用户提交表单的内容。这是对的吗?

在这种情况下,方法get_context_data根本不会帮助你,因为它只会将数据存储在MainView中的当前上下文中。

FormView的form_valid方法将使HttpResponseRedirect成为success_url。所以现在的问题是,我们如何才能将数据提供给这个视图。

Django return redirect() with parameters中所述,最简单的方法是将数据放入会话中。然后,您可以在result.html模板中访问此数据,如Django: accessing session variables from within a template?

中所述

以下是代码:

class ResultView(TemplateView):
    template_name = "result.html"

class MainView(FormView):
    template_name = 'index.html'
    form_class = UserInputForm
    success_url = 'result/'

    def form_valid(self, form):
        self.request.session['temp_data'] = form.cleaned_data
        return super(MainView, self).form_valid(form)

在result.html模板中,您可以访问此temp_data,以便:

{{ request.session.temp_data }}

答案 1 :(得分:1)

如上所述,您可以覆盖get_context_data

例如,您可以执行以下操作:

def get_context_data(self, **kwargs):
    context = super(MainView, self).get_context_data(**kwargs)
    #set some more context below.
    context['foo'] = bar
    ...
    return context

答案 2 :(得分:0)

在Django class-based view docs的上下文中查找get_context_data。被重写方法返回的dict将被传递到模板中。

答案 3 :(得分:0)

有几件事可能是你的问题。首先,在form_valid()方法中,您处理之前的表单,即您调用该类'父form_valid()。此外,您不会将结果存储在两个方法的公共位置以获取它。尝试类似:

def form_valid(self, form):
    self.data = form.cleaned_data
    return super(MainView, self).form_valid(form)

def get_context_data(self, **kwargs):
    context = super(MainView, self).get_context_data(**kwargs)
    context['data'] = self.data
    return context
相关问题