0

基本上,在我的 index.html 模板中,我希望登录和注册表单在同一个(两者都有 csrf_token)。这是我的看法。

def index(request):
    c = {}
    c.update(csrf(request))
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')

    args = {}
    args.update(csrf(request))

    args['form'] = MyRegistrationForm()

    return render_to_response('index.html', {c, form: args})

问题在于 render_to_response 语句。早些时候,我将索引视图作为两个不同的视图。

    c = {}
    c.update(csrf(request))
    return render_to_response('index.html', c)

是登录的返回语句和

    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')

    args = {}
    args.update(csrf(request))

    args['form'] = MyRegistrationForm()

    return render_to_response('register.html', args)

是注册表单的返回声明。(注册表单和 index.html 登录表单之前在两个不同的模板中。我试图将它们放在一个模板中。

这是我的 index.html 模板(两个表单都在同一个模板中)。

<form action="/accounts/auth/" method="post">{% csrf_token %}
    <label for="username">User name:</label>
    <input type="text" name="username" value="" id="username">
    <label for="password">Password:</label>
    <input type="password" name="password" value="" id="password">

    <input type="submit" value="login" />

</form>
<h2>Register</h2>
<form action="/accounts/register/" method="post">{% csrf_token %}
    {{form}}

    <input type="submit" value="Register" />

</form>
4

1 回答 1

3

你没有解释你的问题是什么,但我看到一件立即看起来不对劲的主要事情。

render_to_response需要一个字典作为其上下文参数。您提供的值{c, form: args}, 不是字典。

在足够新的 Django 版本上,您通常希望render使用render_to_response. 它完成了所有render_to_response工作,并且还使用了一个RequestContext对象,以便上下文处理器正常工作。这对于 csrf 处理特别有用。正如文档所说:

在相应的视图函数中,确保正在使用 'django.core.context_processors.csrf' 上下文处理器。通常,这可以通过以下两种方式之一完成:

  1. 使用 RequestContext,它始终使用“django.core.context_processors.csrf”(无论您的 TEMPLATE_CONTEXT_PROCESSORS 设置如何)。

  2. 手动导入并使用处理器生成 CSRF 令牌并将其添加到模板上下文中。

总的来说,我会将您的观点改写为:

def index(request):
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')
    else:
        form = MyRegistrationForm()

    return render(request, 'index.html', {form: form})

只是为了演示如何在没有 的情况下执行此操作RequestContext

def index(request):
    c = {}
    c.update(csrf(request))
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')
    else:
        form = MyRegistrationForm()
    c['form'] = form
    return render_to_response('register.html', c)

关键是将您的表单和 csrf 令牌都放入字典中。

redirect使用快捷方式和视图名称而不是固定 URL来确定重定向目标通常是一种很好的做法。

于 2013-07-28T18:31:39.490 回答