我在django中寻找以下功能
我正在写一个网站,它包含许多页面:家庭(显示所有书籍),详细信息(选择书籍详细信息),搜索(根据搜索显示书籍)。
现在主页包含特色书籍,简易书籍,大多数着名书籍等栏目。 详细信息页面显示选定的书籍细节,它应显示特色书籍,最着名的书籍。
现在我的问题很有特色,着名的图书块正在重复,所以有没有办法分别保存模板代码(html)和各自的视图方法。所以,如果我从带有参数的主模板中调用这些迷你模板。
因此,如果我想改变一些我可以在一个地方做的事情,那么我可以保持更加通用的方式而且不用重复代码。
我正在考虑使用过滤器,但这是一个好方法吗?还是django提供了任何机制?
答案 0 :(得分: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 %}
答案 1 :(得分:1)
这是template tags的用途。一旦您编写了相应的包含标记,您就可以{% load books %} ... {% newbooks %} .. {% featuredbooks %} ... etc.
将包含相关信息的div放在任何需要的地方。