【问题标题】:Django: How do I override app-supplied urls in my project urlconf?Django:如何在我的项目 urlconf 中覆盖应用程序提供的 url?
【发布时间】:2012-03-07 13:08:57
【问题描述】:

假设我有一个包含三个应用程序的 Django 项目:foo、bar 和glue。我正在尝试遵循可重用的应用程序约定,因此 foo 和 bar 不依赖于(并且不知道任何关于)彼此或胶水。 Glue 包含将其他两个应用程序集成到站点中的代码。

Foo 提供了一个模板标签,我想将它包含在 bar 提供的页面之一中。栏页面的视图可以传递一个备用​​模板。我用胶水制作了一个模板,它扩展了 bar 的模板并包含了来自 foo 的模板标签。为了将我的新模板传递给 bar 的视图,我需要修改指向它的 urlconf 条目。

我的项目 urlconf 看起来像这样:

urlpatterns = patterns('',
  (r'^$', include('glue.urls')),
  (r'^foo/', include('foo.urls')),
  (r'^bar/', include('bar.urls')),
)

将替代模板(或任何其他任意视图参数,就此而言)传递给 bar 中的视图的最优雅的方式是什么?我不想直接修改 bar 的 urlconf,因为这会使它依赖于胶水。

我能想到的唯一其他方法是删除include('bar.urls'),将bar的urlconf中的url模式复制到项目urlconf中,然后修改我感兴趣的模式。这种方法虽然违反了DRY原则。我还缺少其他解决方案吗?

【问题讨论】:

    标签: django django-urls code-reuse


    【解决方案1】:

    不清楚你在问什么,但据我了解,你的问题是:

    将备用模板传递给视图的最优雅的方式是什么 在酒吧?

    这与 url conf 无关,它只是将 URL 映射到方法。

    django 中的模板是从您的 settings.py 中 TEMPLATE_DIRS 中的位置查找的,最重要的是 django 一旦找到模板就会停止查找

    如果您的TEMPLATE_DIRS 为空白(默认情况下),则 django 将在任何已注册应用程序(INSTALLED_APPS 中列出的应用程序)内的templates 目录中查找模板。

    因此,要将备用模板传递给任何应用程序,只需在TEMPLATE_DIRS 中列出的目录中创建一个具有相同名称(和目录结构)的文件。 Django 将首先搜索它,并在找到匹配项时停止。

    这与您覆盖默认管理模板的方式相同。

    对于您的特定情况,假设您想将 index.html 的替代版本传递给应用程序 bar

    在项目路径的某处创建一个目录override_templates

    在其中创建bar/templates/目录,并将您自定义的index.html添加到该目录中,这样您就有了override_templates/bar/templates/index.html

    settings.py 中将override_templates 的完整路径添加到TEMPLATE_DIRS

    现在 django 将首先在您的自定义目录中搜索任何请求的模板,然后加载您的备用 index.html。

    【讨论】:

    • 我会研究这种方法,但这并不是我想要的。如果我想向视图传递一些其他参数怎么办?该视图在 urlconf 中被调用,因此这似乎是传递参数的合乎逻辑的地方。
    • 您想将任意参数传递给视图?请澄清您的问题。
    • 是的,类似于您从 urlconf 传递给通用视图的参数。
    【解决方案2】:

    显然,在 urlconf 中允许重复的 URL,并且列出的第一个匹配项将具有优先权:

    urlpatterns = patterns('',
      (r'^$', include('glue.urls')),
      (r'^foo/', include('foo.urls')),
    
      # This will override the same URL in bar's urlconf:
      (r'^bar/stuff/$', 'glue.views.new_bar_stuff', {'arg': 'yarrgh'}, 'bar_stuff'),
    
      (r'^bar/', include('bar.urls')),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 2018-03-10
      • 2011-07-05
      • 1970-01-01
      • 2022-11-30
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多