我想从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
函数根本没有被调用。
如果您需要更多信息,请告诉我。
谢谢你的帮助!