在模板中访问请求变量

时间:2013-11-07 15:50:55

标签: python django django-templates

我正在编写一个简单的应用程序,我可以从表单中收集一些信息并将其显示在同一模板上。

以下是代码,

当我尝试从模板访问 - {{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>

4 个答案:

答案 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 FormModelForm类来处理表单也更好。请在此处查看: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。 如果用户按下后退按钮,这将阻止数据被提交两次。

这是最佳做法,应始终如此。

相关问题