我正在编写一个简单的应用程序,我可以从表单中收集一些信息并将其显示在同一模板上。
以下是代码,
当我尝试从模板访问 - {{request.POST['fname']}}
时,我收到以下错误,
Could not parse the remainder: '['fname']' from 'request.POST['fname']'
如何访问模板中的请求变量?
views.py
def test_page(request):
print 'request.method =', request.method
if request.method == 'POST':
print 'request.post = ', request.POST['fname']
variables = RequestContext(request,{'display_form':False})
return render_to_response('test_page.html',variables)
else:
variables = RequestContext(request,{'display_form':True})
return render_to_response('test_page.html',variables)
template
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Test Page</title>
</head>
<body>
This is a test page
{% if display_form %}
<form action="." method="post">{% csrf_token %}
FIRST NAME : <input type="text" name="fname">
<input type="submit" value="register"/>
</form>
{% else %}
{{request.POST['fname']}}
{% endif %}
</body>
</html>
答案 0 :(得分:2)
你可以写:
{{ request.POST.fname }}
这将在fname
中执行request.POST
的查找。
Django支持:
foo['bar']
)foo.bar
)foo[bar]
)每当您撰写foo.bar
时(请参阅文档中的Variables and lookups)。
答案 1 :(得分:1)
在模板中访问字典值的正确方法是:{{ request.POST.fname }}
答案 2 :(得分:1)
在模板中显式获取request.POST是个坏主意。处理request.POST是更多的业务逻辑相关所以控制器/视图应该处理它。
这是优化的代码。代码重复较少,而且更清晰。如果没有指定名字,则fname为None
。使用Django Form
或ModelForm
类来处理表单也更好。请在此处查看:https://docs.djangoproject.com/en/dev/topics/forms/
您还应该使用UTF-8
代替charset=ISO-8859-1" to have less problems with unicode characters later.
http-equiv is a little bit outdated (it's used for HTML 4.01), use
meta charset`。
视图:
def test_page(request):
if request.method == 'POST':
fname = request.POST.get('fname')
display_form = False
else:
fname = None
display_form = True
variables = RequestContext(request,{'display_form': display_form, 'fname': fname})
return render_to_response('test_page.html', variables)
模板:
<html>
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
This is a test page
{% if display_form %}
<form action="." method="post">{% csrf_token %}
FIRST NAME : <input type="text" name="fname">
<input type="submit" value="register"/>
</form>
{% else %}
{{ fname }}
{% endif %}
</body>
</html>
答案 3 :(得分:0)
首先,你应该通过request.POST.fname
索引它,它是一个类似对象的字典,它总是返回字符串,只是一个FYI。
其次,在处理POST
请求后,您应始终发出重定向(HttpResponseRedirect
)而非正常render
。
如果用户按下后退按钮,这将阻止数据被提交两次。
这是最佳做法,应始终如此。