如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章