2

我正在 django 中寻找以下功能

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

现在主页包含精选书籍,刚刚出版的书籍,最着名的书籍等块。详细信息页面显示所选书籍的详细信息,它应该显示特色书籍,最着名的书籍。

现在我的问题是特色,着名的书块被重复了,所以有什么方法可以单独保留模板代码(html)以及单独的视图方法。所以如果我从带有参数的主模板中调用这些迷你模板。

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

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

4

2 回答 2

4

您可以将可重用的 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 %}
于 2012-09-18T15:52:43.313 回答
1

这就是模板标签的用途。一旦您编写了适当的包含标签,您就可以简单地{% load books %} ... {% newbooks %} .. {% featuredbooks %} ... etc.将包含相关信息的 div 放在您需要的任何地方。

于 2012-09-18T15:56:41.467 回答