是否有可能猴子修补 Django 的反向?
Is it possible to monkey patch Django's reverse?
我们的一些网址包含 #
。这些用于反向查找,都使用 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
中。没有任何效果。
当您修补 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)
这行得通。在您的 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
我们的一些网址包含 #
。这些用于反向查找,都使用 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
中。没有任何效果。
当您修补 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)
这行得通。在您的 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