我们的一些urls包含#
。它们用于反向查找,使用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
中。毫无办法。
发布于 2018-02-12 22:35:57
这是可行的。在您的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
发布于 2018-01-19 22:04:53
在您修补reverse
时,原始函数可能已经导入到django.urls
(通常从其中导入)和django.template.defaulttags
( {% url %}
标记使用它)中。尝试在这些模块中对其进行修补:
import django.urls
django.urls.reverse = patch_reverse(django.urls.reverse)
import django.template.defaulttags
django.template.defaulttags = patch_reverse(django.template.defaulttags)
https://stackoverflow.com/questions/48350131
复制相似问题