将数据从post()传递到get_context_data()

时间:2016-07-12 03:06:13

标签: python django

我正在从提交的表单中生成一个对象。我想将生成的<form class="form-inline pull-xs-right"> <input class="form-control" type="text" [(ngModel)]="searchKey" placeholder="Search"> <button class="btn btn-success-outline" type="submit" (click)="searchContact(searchKey)">Search</button> </form> <spreadsheet [contactlist]="searchedList"></spreadsheet> 作为隐藏表单元素传递给下一个表单。但是,我无法弄清楚如何将变量从AutoField传递到post()。我知道首先调用get_context_data(),然后调用post(),但将变量添加到get_context_data()不会产生我期望的结果(self上不存在该属性)

以下是我遇到的一个例子:

self
def get_context_data(self, **kwargs): context = super(MyView, self).get_context_data(**kwargs) print self.hello return context def post(self, request, *args, **kwargs): self.hello = "hello" return HttpResponseRedirect(request.path) 中调用时,

self.hello无效。我觉得我可能会误认为get_context_data电话,但我不确定如何渲染模板。

这是一个简单的错误,还是我应该以完全不同的方式接近这个?

2 个答案:

答案 0 :(得分:2)

通过自己定义post,您可以覆盖视图的默认行为。您可以看到没有调用get_context_data或任何其他类方法,因此它们自然不会被调用。

通常,您不应该覆盖特定的get或post方法。您尚未显示完整视图,因此不清楚您要尝试实现的行为,但是例如在表单视图中,您需要定义success_url以设置表单在提交后重定向到的位置。

答案 1 :(得分:1)

您必须找到将对象ID传递到下一页的方法。想到的选项是将其放入URL或solarissmoke建议将其保存在会话中。如果你在网址中进行操作,你也可以将页面序列放在那里(对于forst表单意味着1,对于第二个表单意味着2)。

这种方法的好处在于,您可以在一个视图中覆盖所有功能:根据页面设置get_object方法中的相应字段(self.fields = [....])和模板名称get_template_names方法。

所以使用Updateview,它看起来像这样:

urls.py:

....
url(r'^mysite/(?P<object_no>\d+)/(?P<form_no>\d+)$', BaseView.as_view()),

views.py:

class BaseView(UpdateView):
    def get_object(self):     
        obj=MyModel.objects.get(id=self.kwargs['object_no'])  
        form_no = self.kwargs['form_no']
        if form_no=="1":
             self_fields=["field1","field2"...]
        .....
    def get_object(self):     
        obj=MyModel.objects.get(id=self.kwargs['object_no'])  
        form_no = self.kwargs['form_no']
        if form_no=="1":
             self_fields=["field1","field2"...]  
        .....             
        return obj
    def get_template_names(self):
        from_no = self.kwargs['form_no']
        if form_no=="1":
             return ["template1.html"]
        ....

您必须确保所有字段都为空。