Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将表单数据从视图发送到模板_Python_Django_Django Forms_Django Templates_Django Views - Fatal编程技术网

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处理器中请求
,才能工作。