【问题标题】:How do I pass back additional context variable in this Django class-based-view?如何在这个基于 Django 类的视图中传回额外的上下文变量?
【发布时间】:2014-08-13 15:05:45
【问题描述】:

我有一个名为 myView 的基于 Django 类的表单提交视图,如下所示。 此视图接受作为 URL 的一部分提交的参数以及用户填写到表单字段中的数据。当表单提交有效时,一切正常。

但是,如果表单字段验证失败,那么我希望这些错误显示在页面上并且用户必须重新提交。增加的问题是当发生这种情况时,需要将两个额外的参数(myArg1 和 myArg2)作为上下文字典的一部分发送。

目前,form_invalid 返回super(myView, self).form_invalid(form)。如何将 myArg1 和 myArg2 添加到此 return 语句中,以便它们处于新的重新提交的上下文中?

class myView(FormView, TemplateView):
    template_name = 'myTemplate.html'
    form_class = myForm
    success_url = reverse_lazy("mySuccess")


    def form_valid(self, form):
        BlahBlahBlah


    def form_invalid(self, form):

        myArg1 = "A"
        myArg2 = "B"


        return super(myView, self).form_invalid(form) 
        # I need to send back myArg1 and myArg2 as members of the 
        # context dictionary in the line above. How?

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    我更改了您的代码以遵循一些 python 指南(关于命名类等),您需要的是 form_invalid 方法。 请不要同时使用FormView和TemplateView,没有必要……FormView就够了:

    class MyView(FormView):
        template_name = 'my_template.html'
        form_class = MyForm
        success_url = reverse_lazy("my-success")
    
    
        def form_invalid(self, form):
            return self.render_to_response(self.get_context_data(form=form,myArg1='A',myArg2='B'))
    

    【讨论】:

    • 这个解决方案不起作用有两个原因:1)如果我删除了 TemplateView 的子类,那么在 form_invalid()、get_context_date() 和 form_valid() 中,kwargs 不再包含我的参数m 传入 URL。我需要那些 2) 我尝试了您建议的 render_to_response 解决方案。这会导致表单重新显示为空 - 没有用户填写的数据,也没有任何表单错误消息。
    • FormView 与 TemplateView 一样扩展了 View(和其他一些类),上述所有功能都存在于 FormView 中,如果您不了解 CBV 的工作原理和继承方式,那么此链接将有所帮助你:ccbv.co.uk
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2016-01-15
    • 2020-02-17
    • 2015-11-08
    相关资源
    最近更新 更多