我希望能够创建引用URL的反向链接,如果引用者是视图,如果它不是视图,则返回默认页面的反向链接(不要问......它的类型一个奇怪的要求)。
基本上,如果用户从同一个django网站上的另一个视图到达相关页面,则后面的链接应该是返回到该视图。
如果用户从外部站点进入,则后面的链接应该转到默认视图。
Javascript不是一个理想的解决方案,但如果没有别的办法,我愿意考虑它。
答案 0 :(得分:4)
使用django.core.urlresolvers.resolve
确定它是否是内部Django URL。如果不是,它将引发django.core.urlresolvers.Resolver404
,否则它将返回一个匹配对象,您可以在必要时进行内省。您可以根据需要将REFERER
环境变量提供给此,如果resolve
引发Resolver404,则将网址替换为默认网址。
编辑:实际上,不,resolve
显然只适用于网址的路径组件。因此,您必须使用urlparse解构REFERER
标头,以确定它是否是正确的域,如果是,请在解析后的URL的路径组件上使用resolve
来计算如果URL是您的Django站点的一部分,则输出。
# code not tested, YMMV, etc.
from urlparse import urlparse
from django.core import urlresolvers
HOME = 'http://my.site.com/'
def generate_back_url(url, default_url=HOME):
parsed = urlparse(url)
if parsed.netloc == 'my.site.com':
try:
urlresolvers.resolve(parsed.path)
except urlresolvers.Resolver404:
back_url = default_url
else:
back_url = url
else:
back_url = default_url
return back_url
# ...
def my_view(request):
# ...
# truth be told I'm not sure whether the .get() is necessary, sorry.
back_url = generate_back_url(request.META.get('REFERER', HOME))
# ...
答案 1 :(得分:2)
改为使用django.utils.http.is_safe_url()
。
from django.utils.http import is_safe_url
def my_view(request):
# ...
if is_safe_url(url=url, host=request.get_host()):
back_url = url
else:
back_url = default_url