我们的一些网址包括#
。它们用于反向查找,使用reverse
和{% url
模板标记(内部使用reverse
)。 Django 1.8曾经不管它,1.11现在把它编码为%23
。
是否有可能在某处放置一个猴子补丁包装并让它在任何地方都可以使用?这是我的包装纸:
def patch_reverse(func):
def inner(*args, **kwargs):
print "inner reverse"
url = func(*args, **kwargs)
return url.replace("%23", "#")
return inner
from django.urls import base
base.reverse = patch_reverse(base.reverse)
print
声明是我可以看到它是否真正在运行。
我已尝试将其置于设置,第一个已安装应用的__init__
以及首个已安装应用的urls
中。什么都行不通。
答案 0 :(得分:1)
当您修补reverse
时,原始功能可能已导入django.urls
(您通常从中导入)和django.template.defaulttags
({% url %}
} tag使用它。尝试在这些模块中修补它:
import django.urls
django.urls.reverse = patch_reverse(django.urls.reverse)
import django.template.defaulttags
django.template.defaulttags = patch_reverse(django.template.defaulttags)
答案 1 :(得分:0)
这很有效。在settings.py
或同等设置模块中:
from django import urls
from django.core import urlresolvers
_django_reverse = urlresolvers.reverse
def _reverse(*args, **kwargs):
result = _django_reverse(*args, **kwargs)
# Do whatever you want to do to reverse here
return result.replace("%23", "#")
urlresolvers.reverse = _reverse
urls.reverse = _reverse