【问题标题】:Is there any tiles kind of concept in djangodjango中是否有任何瓷砖类型的概念
【发布时间】:2012-09-10 22:06:50
【问题描述】:

我正在寻找 django 中的以下功能

我正在写一个网站,它包含许多页面,例如:主页(显示所有书籍),详细信息(所选书籍详细信息),搜索(根据搜索显示书籍)。

现在主页包含精选书籍、最新书籍、最著名书籍等块。 详细信息页面显示所选书籍的详细信息,并且应该显示特色书籍、最著名的书籍。

现在我的问题被推荐了,著名的书块被重复了,那么有什么办法可以分开保存模板代码(html)和单独的视图方法。所以如果我从带有参数的主模板中调用这些迷你模板。

这样我就可以保持更通用的方式,并且将来如果我想更改某些内容,我可以在一个地方完成。

我想用过滤器来做,但这是个好方法吗?还是 django 提供了任何机制?

【问题讨论】:

    标签: django templates generics filter


    【解决方案1】:

    您可以将可重用的 HTML 块隔离到模板中,然后使用 {% include %} 标记将它们包含在其他模板中。

    它们不带参数,但您可以设置主模板以便正确设置变量,或者使用{% with %} 标记在{% include %} 之前设置上下文

    作为一个具体的例子,你的视图代码可以像这样设置书籍列表:

    def book_detail_view(request, book_id):
        # Get the main book to display
        book = Book.objects.get(id=book_id)
        # Get some other books
        featured_books = Book.objects.filter(featured=True).exclude(id=book_id)
        just_in_books = Book.objects.filter(release_data__gte=last_week, featured=False).exclude(id=book_id)
    
        return render("book_template.html",
                      dict(book=book,
                           featured_books=featured_books,
                           just_in_books=just_in_books))
    

    然后,在您的模板 (book_template.html) 中:

    <h1>Here's your book</h1>
    <!-- fragment uses a context variable called "book" -->
    {% include "book_fragment.html" %}
    
    <h2>Here are some other featured books:</h2>
    {% for featured_book in featured_books %}
        <!--Temporarily define book to be the featured book in the loop -->
        {% with featured_book as book %}
            {% include "book_fragment.html" %}
        {% endwith %}
    {% endfor %}
    
    <h2>Here are some other books we just received:</h2>
    <!-- This is a different way to do it, but might overwrite
         the original book variable -->
    {% for book in just_in_books %}
        {% include "book_fragment.html" %}
    {% endfor %}
    

    【讨论】:

    • 如果我们使用 include 和 with 标签,在这两种情况下,我们都必须从主模板的视图函数将对象传递给迷你模板。所以它再次紧密耦合对吗?有没有其他方法可以从带有参数的主模板调用迷你模板,以便在内部它会转到该特定视图函数并返回响应?但你的解决方案也可以接受,因为我现在只这样做。
    • 您应该始终在视图函数中设置对象本身,但您可以在模板中以不同的方式使用它们。而且视图根本不需要知道迷你模板。
    • 我想到了一些其他的想法。 1)为您的主视图设置一个“特色书籍”混合,或 2)使用 javascript 加载特色书籍子模板,它的视图功能在单独的请求中。 (据我所知)使用两个视图函数来处理请求是不可行的
    【解决方案2】:

    这就是template tags 的用途。编写适当的包含标签后,您只需执行 {% load books %} ... {% newbooks %} .. {% featuredbooks %} ... etc. 即可将包含相关信息的 div 放在您需要的任何位置。

    【讨论】:

    • 所以你的意思是写一些自定义标签?
    • 正确。这样,当事情发生变化时,您不必担心子模板名称拼写错误,因为 Django 需要存在模板标签(并且启动时间更短)。另外,您可以将上下文从模板传递给标签,这在使用 {% include %} 时是不可能的。
    • 所以你的意思是写一些自定义标签?如果是,那么我们如何在主模板中获得迷你模板响应。如果我们调用 {% load books %} 它会返回一些 book 对象,对吗?还是我们编写books 函数来返回html 内容?请不要因为我问更多问题而感到难过,只是为了弄清楚。即使它会帮助许多像我一样挣扎的人。如果可能,请提供类似“Ian Clelland”提供的示例。
    • 模板标签可以被视为“迷你视图”,除了从 URL 中获取请求和参数,它们从标签调用中获取模板上下文(如果明确要求)和参数。 {% load books %} 加载名为“books”的模板标签库,您必须单独调用库中的标签。链接到的页面上有许多示例,但请特别注意"Inclusion tags" 部分中的示例,因为您的大多数都是这种类型。
    • 哇... grt... 你让我很开心。仅我正在寻找的包含标签:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多