Django中的动态登录/注销URL

2 投票
2 回答
1110 浏览
提问于 2025-04-16 06:03

我有一个应用程序,它的页面地址像这样:/stage/stagename。这里的stagename是可以变化的。我的网址映射器只会查找符合[0-9A-Za-z]+这个规则的内容来填充这个位置。

现在,由于我的设置,我的应用程序会固定在/stage/stagename这个路径下。我不能改变这个设置(因为要做大规模的改动太麻烦了,现在不想动这个)。

我需要使用django.contrib.auth。但是登录和登出的网址不能直接写在我的设置文件里,因为它们会根据我的应用程序所在的位置而变化(比如一个可能是/stage/foo/login,另一个可能是/stage/bar/login)。

我该如何让后端使用这种动态的网址呢?

我还有一个问题,就是我需要把stagename这个参数传递给生成我网址的模板。我该怎么做呢?

2 个回答

0

/stage/foo/login 和另一个可能是 /stage/bar/login。

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

这可能正是你想要的。

不过,看起来你遇到的问题比这更严重。“对我的设置进行大规模更改太麻烦”说明你可能有更根本的问题。

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 %}">

希望这对你有帮助,如果代码中有错别字请见谅!关于认证登录视图的文档有点难找,点这里,然后往上滚动一点就能找到!

撰写回答