Django的URL标签能否直接显示RedirectView的目标URL?
解决方法
要让模板里的链接直接输出RedirectView的目标URL,而非路由路径,有几个实用方案:
方案一:把目标URL存到配置里直接调用
- 在项目的
settings.py中添加配置项:
SUPPORT_URL = "http://www.example.com"
- 确保模板能访问配置:在
TEMPLATES的OPTIONS里,将django.template.context_processors.settings加入context_processors列表:
TEMPLATES = [ { # 其他配置... 'OPTIONS': { 'context_processors': [ # 其他处理器... 'django.template.context_processors.settings', ], }, }, ]
- 在模板里直接用配置项替代
{% url %}标签:
<a href="{{ settings.SUPPORT_URL }}">Link</a>
方案二:自定义模板标签获取目标URL
如果不想改动配置,也可以写个简单的模板标签提取RedirectView的目标地址:
- 在你的app目录下创建
templatetags文件夹(没有就新建),里面新增custom_tags.py文件,内容如下:
from django import template from django.urls import get_resolver from django.views.generic.base import RedirectView register = template.Library() @register.simple_tag def get_redirect_target(name): # 遍历路由匹配规则 for pattern in get_resolver().url_patterns: if pattern.name == name: view_cls = pattern.callback # 判断是否为RedirectView的子类 if isinstance(view_cls, type) and issubclass(view_cls, RedirectView): return view_cls.url # 找不到对应路由返回空串 return ""
- 在模板开头加载自定义标签:
{% load custom_tags %}
- 用自定义标签替代
{% url %}:
<a href="{% get_redirect_target "support" %}">Link</a>
方案三:路由里定义变量复用
在urls.py里把目标URL定义成变量,后续路由和模板都能复用:
- 修改
urls.py:
SUPPORT_TARGET = "http://www.example.com" path("support/", RedirectView.as_view(url=SUPPORT_TARGET), name="support"),
- 将这个变量传到模板上下文(比如通过视图或上下文处理器),然后直接在模板里使用:
<a href="{{ SUPPORT_TARGET }}">Link</a>
注意:
{% url %}标签的核心作用是根据路由名称生成对应路径,无法直接让它输出RedirectView的目标URL,因此只能通过上述替代方案实现需求。
内容的提问来源于stack exchange,提问作者Kevin Renskers
相关产品推荐
相关产品推荐

