如何在 Django 模板中集中 URL?

Posted

技术标签:

【中文标题】如何在 Django 模板中集中 URL?【英文标题】:How can I centralize URLs in Django templates? 【发布时间】:2012-02-13 17:14:57 【问题描述】:

在编写我的 Django 应用程序时,我在对模板中的所有 URL 进行硬编码时犯了一个错误。

例如,我的链接如下所示:

<a href="/course/63/">Advanced Basketweaving</a>

现在,我的客户坚决希望我将所有与此类似的链接实例更改为

<a href="/class/63/">Advanced Basketweaving</a>

“类”替换“课程”。

用艾默生的话来说,愚蠢的一致性是小脑袋里的妖精,所以我必须通过艰苦的查找和替换操作来为我的错误付出代价。

在这里做什么是正确的?

【问题讨论】:

【参考方案1】:

假设您的 urls.py 有这样的条目:

url(r'^course/(?P<course_id>\d+)/$', view_course, name='view_course')

您可以在模板中使用url template tag:

<a href="% url view_course course.id %">Advanced Basketweaving</a>

然后,当您的客户要求您更改网址时,您只需在 urls.py 中进行一项更改。

url(r'^class/(?P<course_id>\d+)/$', view_course, name='view_course')

不需要对模板进行任何更改。

愉快的搜索和替换——现在你知道下次了;)

【讨论】:

url 的第三个参数是kwargs,所以我认为你必须使用name='view_course' 好地方,URL 模式被破坏了。现已修复。 如果你碰巧安装了 mysql,它带有一个很棒的replace 命令,在这些情况下会派上用场。 我做了一个小小的修改。按照惯例,我使用原始字符串作为 URL 模式。否则你必须写'\\d+'。换句话说,您不必转义原始字符串中的反斜杠。 @BrianNeal 为什么不测试呢?当你这样做时,你会看到两个版本都可以工作。你在url() 中设置name 的方式完全没有问题。 % url %(基于reverse)尝试加载相应的视图,而不是 url 记录。如果存在可以接受这些 args 和 kwargs 的视图函数,则找到匹配项。 Python 中每个参数数量有限的函数都可以使用位置参数或命名参数来调用。【参考方案2】:

我相信标准方法是使用url template tag:

% url path.to.course_view 63 %

...主要的好处是您不需要对 URL 进行硬编码。所以现在有点晚了,但这次你最好使用url 标签,以防客户明天回来并希望他们都阅读/classes/class/63 - 此时你只需要更改URLconf 文件中的单个 URL 模式。

【讨论】:

【参考方案3】:

使用 sed(在提交版本控制之后)。一次搜索和替换整个目录。

这是一个操作方法:http://www.grymoire.com/Unix/Sed.html

您可能还应该创建一个视图,将旧式 url 重定向到新式 url,以防任何书签或您错过的任何链接。

【讨论】:

以上是关于如何在 Django 模板中集中 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 模板中获取当前 URL?

如何在 Django 模板中获取当前 URL?

如何替换重新“。”在 Django 模板 url 标签中

Django模板中的Python [关闭]

如何在模板中删除 django URL 中的尾随斜杠?

在 Django 中,如何使用模板和 DB 对象中使用的动态 URL 实现样板 HTML 变量?