2012-10-03 63 views
3

编辑:
我希望'success_url'(即result.html)显示从'form.process()''数据'。下面的代码显然不起作用。 任何人都可以请告诉我它有什么问题或建议另一种方式来基本查看模板中的上下文'数据'(无论是在列表或字典的形式),即更好的方式来显示数据后,已提交。
非常感谢提前。发送表单数据到模板

-- 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() 

回答

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 }} 
+0

是!'会话'是我正在查找的内容。谢谢DanEEStar。 – DGT

+0

要添加:您需要'context_processors'中的'django.core.context_processors.request'才能使用它。 – SaeX

0

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

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 
+0

谢谢,kranthi,但是重写'get_context_data'并不会让我在'result.html'模板中获得'foo',这正是我试图实现的目标,除非有人知道更好的方式来显示数据提交表单后提交给用户。 – DGT

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 
+0

谢谢,但对不起,似乎没有工作。我得到“'MainView'对象没有属性'数据'”错误。此外,form.process()似乎没有踢入。如果我尝试打印它,我什么也得不到。 – DGT

+0

什么是process()?你想做什么?也许你可以将form_valid的结果存储在self.data中,并在get_context_data中使用它。 – pyriku

+0

我是django的新手,请耐心等待。 'UserInputForm'是一种表单,当用户提交时,我希望用户输入/选择的表单值(从textarea,下拉列表等)通过类中的方法,返回的值将显示在模板('result.html')。前面提到的'过程'是指调用另一种方法。 – DGT