如何重定向 Django 模板并使用“Next”变量?

Moh*_*d B 3 python django django-templates django-forms django-views

我正在使用 Django 的内置登录视图,如下面的代码片段所示:

网址.py

    url(r'^login$',login,{'template_name': 'login.html'},name="login"),
Run Code Online (Sandbox Code Playgroud)

模板.html

<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
</tr>
<tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
Run Code Online (Sandbox Code Playgroud)

如何使用下一个变量重定向到与 django 重定向到的默认/accounts/profile/不同的 URL ?我知道有人提到 settings.py 文件,但我想知道如何利用下一个变量来做到这一点?

(即使在参考文档后,我也不确定下一个变量是如何工作的,对此的解释将不胜感激)

Vip*_* av 5

如果您使用的是 django 登录视图,即,

from django.contrib.auth.views import login
Run Code Online (Sandbox Code Playgroud)

您只需要将下一个 url 传递给模板。所以当请求被发送到登录视图时,代码就可以重定向到那个 url。没有找到下一个网址

settings.LOGIN_REDIRECT_URL is used
Run Code Online (Sandbox Code Playgroud)

你可以简单地传递下一个网址,就像,

<form method="post" action="{% url 'login' %}?next={{next_url}}">
Run Code Online (Sandbox Code Playgroud)

通过上下文传递“next_url”值。

下一种情况,如果您需要为任何自定义视图进行下一个 url 重定向,只需在视图内编写代码以获取下一个 url,在视图内完成工作后,您可以重定向到下一个 url。

from django.utils.http import is_safe_url

def your_view(request):
    # do your codes
    redirect_to = request.GET.get(next, '') # use get or Post as per your requirement 
    if is_safe_url(url=redirect_to, host=request.get_host()):
        HttpResponseRedirect(redirect_to)
    else:
        # your response
Run Code Online (Sandbox Code Playgroud)

为了消除您对 next 变量如何工作的疑问:在上面的视图中,我们得到了一个 http 请求,并且我们是否已将下一个 url 作为查询参数传递。我们将在视图中获取它。"request.GET.get(next, '')" 会得到你从视图中发送的下一个 url。从视图级别,您可以执行所需的功能,然后如果下一个 url 存在且有效,您可以使用 HttpResponseRedirect 重定向到下一个 url。

对于登录参考:Django:登录后重定向到上一页