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

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

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

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

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

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

“类”替换“课程”。

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

在这里做什么是正确的?

【问题讨论】:

    标签: django django-templates django-urls


    【解决方案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,以防任何书签或您错过的任何链接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        • 2022-11-25
        • 2011-02-22
        • 2020-07-07
        相关资源
        最近更新 更多