1

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

下面是代码,

当我尝试{{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

4 回答 4

2

你可以写:

{{ request.POST.fname }}

这将执行fnamein的查找request.POST

Django 支持:

  • 字典查找 ( foo['bar'])
  • 属性查找 ( foo.bar)
  • 列表查找 ( foo[bar])

每当您编写时foo.bar(请参阅文档中的变量和查找)。

于 2013-11-07T15:52:56.833 回答
1

在模板中访问字典值的正确方法是:{{ request.POST.fname }}

于 2013-11-07T15:52:55.730 回答
1

在模板中明确获取 request.POST 是个坏主意。处理 request.POST 与业务逻辑相关,因此控制器/视图应该处理它。

这是优化的代码。代码重复更少,更清晰。fname 是None如果没有指定名字。Form使用 Django或ModelForm类来处理表单也更好。请在此处查看:https ://docs.djangoproject.com/en/dev/topics/forms/

您还应该使用http-equiv元字符集来代替UTF-8charset=ISO-8859-1" to have less problems with unicode characters later.is a little bit outdated (it's used for HTML 4.01), use

看法:

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>
于 2013-11-07T16:11:04.750 回答
0

首先,您应该通过request.POST.fname它是一个类似对象的字典来索引它,而且它总是返回字符串,仅供参考。

其次,在处理了一个POST请求之后,你应该总是发出一个 redirect ( HttpResponseRedirect) 而不是一个 normal render。如果用户按下后退按钮,这将防止数据被提交两次。

这是最佳做法,应该始终这样做。

于 2013-11-07T15:58:49.490 回答