【问题标题】:Send form data from views to template将表单数据从视图发送到模板
【发布时间】:2012-09-24 21:16:23
【问题描述】:

编辑:
我希望'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()

【问题讨论】:

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


    【解决方案1】:

    有几件事可能是您的问题。首先,在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
    

    【讨论】:

    • 谢谢,但很抱歉,这似乎不起作用。我得到“'MainView' 对象没有属性 'data'”错误。此外,form.process() 似乎没有起作用。如果我尝试在其中打印,我什么也得不到。
    • 什么是进程()?你想做什么?也许您可以将 form_valid 的结果存储在 self.data 中并在 get_context_data 中使用它。
    • 我是 django 新手,请多多包涵。 'UserInputForm' 是一种表单,当用户提交时,我希望用户输入/选择的表单值(来自 textarea、下拉列表等)通过类中的方法,并将返回的值显示在模板('result.html')。前面提到的“进程”是指调用另一个方法。
    • 那么,如果我理解正确的话,您想要在“result.html”中显示用户在表单中引入的内容?如果是这样,请检查我刚刚修改的代码。 form.cleaned_data 有一个字典,其中包含每个字段的清理值。
    【解决方案2】:

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

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

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

    正如Django return redirect() with parameters 中所述,最简单的方法是将数据放入会话中。在 result.html-template 中,您可以按照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 }}
    

    【讨论】:

    • 是的! '会话'是我一直在寻找的。 Gr8。谢谢 DanEEStar。
    • 添加:您需要在您的context_processors 中添加django.core.context_processors.request 才能正常工作。
    【解决方案3】:

    如上所述,您可以覆盖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
    

    【讨论】:

    • 谢谢,kranthi,但覆盖 'get_context_data' 不会让我在 'result.html' 模板中得到 'foo',这是我想要实现的,除非有人知道更好提交表单后向用户显示数据的方式。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多