首页 文章

在Django中加载所有URL时发出信号

提问于
浏览
1

我想在django的所有url模式上执行魔术:

如果他们没有名字,那么我想给他们一个自动名称 .

不幸的是,django似乎加载了懒惰的网址模式 .

实现这个magic-add-name-method很容易,而不是这个问题的一部分 .

问题:在哪里调用这种方法?我需要在加载所有URL并在处理第一个请求之前调用此方法 .

代码应该适用于Django 1.9和Django 1.10 .

背景

Django不赞成使用像这样的import-strings(Deprecate the ability to reverse by dotted path)

reverse('myapp.views.my_view')

我有一个很大的遗留代码库,我不喜欢打字和维护冗余字符 .

我希望所有没有名称的网址都具有相应导入字符串的名称 .

urls.py中的示例:

url(r'^.../.../(?P<pk>[^/]+)/$', views.my_view))

我想将此网址的名称自动设置为“myapp.views.my_view” .

1 回答

  • 1

    我不会在事后使用信号来更改创建的URL,而是为 django.conf.urls.url 写一个替换包装器:

    def url(*args, **kwargs):
        if 'name' not in kwargs:
            kwargs['name'] = modulename(args[1])  # Returns something like 'polls.indexview'
    
        return django.conf.urls.url(*args, **kwargs)
    

    然后你就可以使用了

    # from django.conf.urls import url  # Removed to enable auto-naming
    from autonameroutes.urls import url
    
    from . import views
    
    app_name = 'polls'
    urlpatterns = [
        url(r'^$', views.IndexView.as_view(), name='index'),
        url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
        ...
    ]
    

    逻辑应该与更改系统中的所有路径时基本相同,但是当您想要使用它时,您将拥有更多控制权,并且对于稍后维护代码的开发人员来说,更改将更加明显 .

相关问题