我有一个应用程序可以提供像/ stage / stagename 这样的页面。 stagename 是可变的。 URL映射器只查找[0-9A-Za-z] +来填充该插槽。
现在,由于我的设置,我的应用程序将植根于/ stage / stagename 。我无法改变这一点(没有对我的设置进行大量更改,这对于现在来说太繁琐而且是最后一个选项)。
我需要使用django.contrib.auth
。登录和注销URL不能在我的设置文件中,因为它们将根据我的应用程序的根源而改变(对于一个它可能是/ stage / foo / login而另一个,它可能可能/ stage / bar / login )。
如何让后端使用此类动态网址?
我还有一个问题,我需要将 stagename 参数传递给生成我的URL的模板。我怎么能这样做?
答案 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 )
你可能正在寻找。
然而,你似乎比这更大的问题。 “我的设置发生了巨大变化,这太过繁琐”,这表明存在更严重和根本性的问题。