Django中的动态登录/注销URL
我有一个应用程序,它的页面地址像这样:/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 %}">
希望这对你有帮助,如果代码中有错别字请见谅!关于认证登录视图的文档有点难找,点这里,然后往上滚动一点就能找到!