gpt4 book ai didi

python - 渲染而不传递请求

转载 作者:行者123 更新时间:2023-11-30 23:19:38 27 4
gpt4 key购买 nike

刚接触 Django,我在这方面遇到了一些麻烦。

我有一个注册表单,可以在成功提交后在数据库中创建行。

提交后,我想将用户重定向到登录表单(这需要我将表单作为 render() 的参数传递),并将状态“REGISTRATION_SUCCESSFUL”传递为也是一个参数。

return render(request, 'login.html', {
'form': login_form(),
'status': 'REGISTRATION_SUCCESSFUL'
})

根据状态,我的模板会显示一条消息以指示注册成功。

一切正常,直到您尝试刷新登录页面,它会尝试再次提交注册表单(我想是因为请求已转发到登录页面)。

我尝试过的所有方法都涉及转发请求,这被证明是一个问题。帮助?

提前致谢!

最佳答案

表单提交后,不使用渲染,而是使用HTTPResponseRedirect 。始终返回 HttpResponseRedirect成功处理 POST 数据后。如果用户点击“后退”按钮,这可以防止数据被发布两次。

您在这里面临的问题是 HTTPResponseRedirect 不允许您传递 REGISTRATION_SUCCESSFUL 状态的上下文。

Based on the status, my template then displays a message to indicate the successful registration.

您可以在此处使用 Django's messages framework 。就在 HTTPResponseRedirect 之前,你可以这样做:

from django.contrib import messages
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import RegistrationForm

def registration(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
# ... do something special here if needed
messages.add_message(request, messages.INFO, 'Registration was successful!')
return HttpResponseRedirect(reverse('login_page'))
else:
form = RegistrationForm()
return render(request, 'registration.html', {'form': form})

现在,您可以在“login_page”中显示消息。仅供引用 - 这些消息是基于每个 session 的,因此“注册成功”消息只会显示给您重定向的用户:

login_page.html:(来自 messages documentation 的示例)

{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }} </li>
{% endfor %}
</ul>
{% endif %}

<form method="post">{% csrf_token %}
{{ form }} {# Your login form #}
</form>

在此示例中,您添加的任何消息都将显示在登录表单上方。如果有其他消息,例如“无效注册”,则会显示。

请务必Enable the Django Messages Framework将以下内容添加到您的 settings.INSTALLED_APPS :

INSTALLED_APPS = (
...
'django.contrib.messages',
)

还有你的settings.MIDDLEWARE_CLASSES必须包含:

MIDDLEWARE_CLASSES = (
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)

还有你的settings.TEMPLATE_CONTEXT_PROCESSORS必须包含:

TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.contrib.messages.context_processors.messages',
)

关于python - 渲染而不传递请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25954973/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com