是否有可能猴子修补 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