我想从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
函数。
如果您需要任何进一步的信息,请告诉我。
感谢您的帮助!
答案 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)