是否有可能将Django的补丁反过来?

时间:2018-01-19 21:57:28

标签: python django monkeypatching

我们的一些网址包括#。它们用于反向查找,使用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中。什么都行不通。

2 个答案:

答案 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