【问题标题】:Django {% url %} tag for the currently rendering view当前呈现视图的 Django {% url %} 标签
【发布时间】:2014-10-06 03:20:28
【问题描述】:

我正在开发一个网站,让用户可以阅读以不同方式显示的书籍。例如,我有以下网址:

  • /read_in_white/book_name/chapter_number - 显示白页
  • /read_in_pink/book_name/chapter_number - 显示粉色页面

    我的视图函数是read_in_white(request, book_name, chapter_number)read_in_pink(request, book_name, chapter_number)

    起初我只有read_in_white,它显示白页。它还在 Bootstrap 导航栏中有一些分页控件。这些都位于read_in_white.html 模板中,其中包括用于导航不同书籍或章节的控件。例如,我在模板中有以下内容:

    <a href="{% url "app.views.read_in_white" book='Good Book' chapter=1 %}"/>

    现在我想添加read_in_pink 视图和模板。 read_in_pink 的导航部分与read_in_white 的导航部分几乎相同,但有一点不同:

    <a href="{% url "app.views.read_in_pink" book='Good Book' chapter=1"/>

    我想将所有导航移至基本模板,但我不知道在(% url %} 标记中放置什么。如何找到当前视图的名称?我知道我可以将它添加到上下文中,或者我可以将 bookchapter 更改为查询参数,因此 URL 为 /read_in_pink?book=...&chapter=...,但我希望有像 {% url this_view ... %} 这样简单的东西。

    有吗?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    不,没有,因为这会在视图和模板之间引入 veryer 耦合,这通常是个坏主意。

    但这听起来像你想参数化颜色,不是吗? 然后你可以将颜色传递给导航或任何你想要的地方。

    def read_in_color(request, color, book, chapter):
        if color == "white":
            return render_to_response("whitetemplate")
        if color == "pink":
            return render_to_response("pinktemplate")
    

    然后在你的模板中

    {% url "app.views.read_in_color" color="pink" book="Good Book" chapter=1 %}
    

    【讨论】:

    • 颜色只是一个例子,实际的视图显示文本的不同部分,不同的布局,不同的附加数据。
    • 顺便问一下,为什么这会引入非常强的耦合?在我看来,它只会引入必要的耦合——所有带有分页的视图都需要模板来分页任何人。这样,我只是将分页从模板中剔除。
    • 我改写了,它更强大,因为现在您的模板只与一个视图对象一起使用,而不是仅依赖于数据。它并没有真正激发代码重用 - 然而,这只是我的信念,我没有科学数据来支持它:)
    • 嗯,模板总是与视图对象一起使用——视图调用render。好的,这并不能改变它无法完成的事实。我将在上下文中传递视图名称。无论如何,我正在使视图基于类,因为它们共享大量代码,我也会将其放入基类中。
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 2012-01-26
    • 1970-01-01
    • 2014-01-16
    • 2014-11-14
    • 2012-11-29
    • 2017-03-31
    • 2020-12-23
    相关资源
    最近更新 更多