如何将POST请求数据提交给TemplateView函数?

时间:2016-06-30 20:05:05

标签: django-forms django-views

我想从django模板中的表单执行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进行一些计算并将其发送回模板。通过函数mark_safe()提交到模板的工作正常。

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

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

奇怪的是当我在SearchForm中删除field2时,可以在search_data()函数中访问field1的值。我试图更改表单域,并发现当SearchForm只有1个字段时这是有效的。只要我的SearchForm中有多个字段,我就无法在render()方法之后访问这些值。

我在SearchView中的return语句有什么问题吗?我也试用了已弃用的版本render_to_response(),但正如预期的那样,这并没有改变任何内容。

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

如果您需要任何进一步的信息,请告诉我。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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)