Python 将表单数据从视图发送到模板
编辑:Python 将表单数据从视图发送到模板,python,django,django-forms,django-templates,django-views,Python,Django,Django Forms,Django Templates,Django Views,编辑: 我希望“success_url”(即result.html)显示来自“form.process()”的“数据”。下面的代码显然不起作用。 有谁能告诉我它有什么问题,或者提出另一种基本上在模板中查看上下文“数据”的方法(以列表或dict的形式),即在提交表单后向用户显示数据的更好方法。 非常感谢 -- urls.py -- url(r'^$', view='main_view'), url(r'^result/$', view='result_view'), -- views.py --
我希望“success_url”(即result.html)显示来自“form.process()”的“数据”。下面的代码显然不起作用。 有谁能告诉我它有什么问题,或者提出另一种基本上在模板中查看上下文“数据”的方法(以列表或dict的形式),即在提交表单后向用户显示数据的更好方法。
非常感谢
-- 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()
在Django的上下文中查找
get\u context\u data
。重写方法返回的dict
将被传递到模板中。如上所述,您可以重写get\u context\u 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
有几件事可能是你的问题。首先,在
form\u valid()
方法中,在调用该类的父类form\u 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
据我所知,您希望在结果视图中显示用户提交表单的内容。对吗 在这种情况下,方法get_context_data对您没有任何帮助,因为它只在MainView中的当前上下文中存储数据 FormView的form_valid方法将使HttpResponseResponseDirect指向success_url。所以现在的问题是,我们如何给这个观点提供数据 最简单的方法是将数据放入会话中。然后,您可以在result.html-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模板中,您可以访问此临时数据,以便:
{{ request.session.temp_data }}
谢谢,但很抱歉,这似乎不起作用。我得到“'MainView'对象没有属性'data'”错误。此外,form.process()似乎没有起作用。如果我尝试打印它,我什么也得不到。什么是process()?你想干什么?也许你可以把表单的结果存储在self.data中,然后在get\u context\u数据中使用它。我是django的新手,所以请耐心听我说。“UserInputForm”是一个表单,当用户提交时,我希望用户输入/选择的表单值(来自textarea、dropdown等)通过类中的方法传递,返回的值显示在模板(“result.html”)上。前面提到的“进程”指的是调用另一个方法。因此,如果我理解正确,您希望在“result.html”中显示用户在表单中引入的内容?如果是这样,请检查我刚刚修改的代码。form.cleaned_数据有一个字典,其中包含每个字段的已清理值。谢谢,kranthi,但是覆盖“get_context_数据”并不会在“result.html”模板中得到“foo”,这正是我试图实现的,除非有人知道在提交表单后向用户显示数据的更好方法。是的“会话”是我一直在寻找的。太棒了感谢DanEEStar。添加:您需要
django.core.context\u处理器。在context\u处理器中请求
,才能工作。