2016-06-30 51 views
0

我想从django模板中的窗体执行POST请求,并使用TemplateView中的发布值更改将哪些数据发送到模板。唯一不起作用的是在视图中的单独函数中使用发布的值。如何提交POST请求数据到TemplateView函数?

为了实现上述目标,我创建了一个TemplateView:

class SearchView(TemplateView): 
    template_name = "pages/home.html" 

    def post(self, request, *args, **kwargs): 
     for key in request.POST: 
      print(key) 
      value = request.POST[key] 
      print(value) 
     form = SearchForm(request.POST) 
     if form.is_valid(): 
      context = super(SearchView, self).get_context_data(**kwargs) 
      return render(request, self.template_name, context) 

提交表单的所有值获得印刷包括CSRF中间件令牌。

这是我的SearchForm:

class SearchForm(forms.Form): 
    field1 = forms.CharField(label='field1 label', max_length=25) 
    field2 = forms.CharField(label='field2 label', max_length=25) 

在查看我还创建了一个函数调用search_data:

def search_data(self): 
    for key in self.request.POST: 
    print(key) 
    value = self.request.POST[key] 
    print(value) 

这个功能是通过模板调用JavaScript和

{{ view.search_data }} 

后来在这个函数中,我使用formdata进行一些计算并将其发送回第e模板。通过功能mark_safe()可以正常提交模板。

正如我所提到的,我在模板中的<form>中通过{% csrf_token %}使用CSRF中间件令牌。

问题是,当我试图在search_data()函数的post请求中访问/打印表单值时,表单值为空。

奇怪的是,当我删除我的SearchForm中的field2时,可以在search_data()函数中访问field1的值。我试图改变formfields,发现这在SearchForm只有1个字段时有效。每当我在我的SearchForm中有超过1个字段时,我无法访问render()方法后面的值。

在SearchView中我的return语句有什么问题吗?我试用了不推荐使用的版本render_to_response(),但正如预期的那样,这并没有改变任何东西。

我也试过return render(request, self.template_name, {'form': form}),但search_data函数根本没有被调用。

如果您需要更多信息,请告诉我。

谢谢你的帮助!

回答

0

对于那些有兴趣谁我在我的post()功能写入POST请求的值到会话解决了这个问题:

for key in request.POST: 
    keys.append(key) 
    values.append(request.POST[key]) 
request.session['keys'] = keys 
request.session['values'] = values 

现在我能够通过访问这些在我search_data()功能:

for value in self.request.session['values'] 
    print(value) 
for key in self.request.session['keys'] 
    print(key) 
相关问题