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

时间:2016-09-03 01:34:08

标签: python django django-forms django-templates django-views

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

urls.py

    url(r'^login$',login,{'template_name': 'login.html'},name="login"),

template.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>

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

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

1 个答案:

答案 0 :(得分:3)

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

from django.contrib.auth.views import login

您只需将下一个网址传递给模板即可。因此,当请求发送到登录视图时,代码就会重定向到该URL。没有找到下一个网址

settings.LOGIN_REDIRECT_URL is used

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

一样
<form method="post" action="{% url 'login' %}?next={{next_url}}">

传递&#34; next_url&#34;价值通过上下文。

下一种情况,如果您需要为任何自定义视图进行下一个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

清除您对下一个变量如何工作的疑问:在上面的视图中,我们得到一个http请求,如果我们已经将下一个url作为查询参数传递。我们将在视图中得到它。 &#34; request.GET.get(next,&#39;&#39;)&#34;将为您提供从视图发送的下一个网址。从视图级别,您可以执行所需的功能,然后如果下一个URL存在且有效,您可以使用HttpResponseRedirect重定向到下一个URL。

登录参考:Django: Redirect to previous page after login