Django中的动态登录/注销URL

时间:2010-10-25 10:40:46

标签: python django django-authentication

我有一个应用程序可以提供像/ stage / stagename 这样的页面。 stagename 是可变的。 URL映射器只查找[0-9A-Za-z] +来填充该插槽。

现在,由于我的设置,我的应用程序将植根于/ stage / stagename 。我无法改变这一点(没有对我的设置进行大量更改,这对于现在来说太繁琐而且是最后一个选项)。

我需要使用django.contrib.auth。登录和注销URL不能在我的设置文件中,因为它们将根据我的应用程序的根源而改变(对于一个它可能是/ stage / foo / login而另一个,它可能可能/ stage / bar / login )。

如何让后端使用此类动态网址?

我还有一个问题,我需要将 stagename 参数传递给生成我的URL的模板。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

如果您可以将redirect_to放入登录模板的上下文中,则可以使用一种机制来选择更改重定向网址。

在您的登录模板中,向表单添加额外的隐藏输入

<input type="hidden" name="next" value="{% url redirect_to %}">

现在,在您的urls.py文件中,您可以指定用于重定向的输入:

url(r'^login/$',
    auth_views.login,
    {'template_name': 'registration/login.html',
     'redirect_field_name': 'next'},
    name='auth_login'),

如果你这样做,那么你将被重定向到不同的地方,具体取决于redirect_to的值。

您可以通过拥有多个已命名的登录网址将redirect_to置于您的上下文中:

url(r'^login/$',
    auth_views.login,
    {'template_name': 'registration/login.html',
     'redirect_field_name': 'next',
     'extra_context': {'redirect_to': 'foo_url'}
    },
    name='foo_login'),

url(r'^login/$',
    auth_views.login,
    {'template_name': 'registration/login.html',
     'redirect_field_name': 'next',
     'extra_context': {'redirect_to': 'bar_url'}
    },
    name='bar_login'),

或者如果你不想做那样的事情,你可以在会话中使用一些东西:

<input type="hidden" name="next" value="{% url session.redirect_to %}">

希望这会有所帮助,并且如果代码中存在拼写错误而道歉! auth登录视图的文档有点难以链接到link。转到该链接并向上滚动一点!

答案 1 :(得分:0)

  

/ stage / foo / login,另一方面,它可能会/ stage / bar / login)。

url( r'^stage/(?P<name>[^/]+)/login/$', some_view_function )

你可能正在寻找。

然而,你似乎比这更大的问题。 “我的设置发生了巨大变化,这太过繁琐”,这表明存在更严重和根本性的问题。