2

私はdjangoで次の機能を探しています

私はウェブサイトを書いていますが、それには多くのページが含まれています。たとえば、ホーム(すべての本を表示)、詳細(選択した本の詳細)、検索(検索に基づいて本を表示)。

現在、ホームページには特集本、ジャストイン本、最も有名な本などのブロックが含まれています。詳細ページには、選択した書籍の詳細が表示され、注目の書籍、最も有名な書籍が表示されます。

現在、私の質問が取り上げられ、有名な本のブロックが繰り返されているため、テンプレート コード (html) とそれぞれのビュー メソッドを別々に保持する方法はありますか。したがって、引数を使用してメイン テンプレートからこれらのミニ テンプレートを呼び出すとします。

より一般化された方法を維持できるように、将来もコードを繰り返さずに何かを変更したい場合は、1 か所で変更できます。

フィルターでやろうと思っているのですが、いい方法でしょうか?またはdjangoは何らかのメカニズムを提供しましたか?

4

2 に答える 2

4

{% include %}HTML の再利用可能なブロックをテンプレートに分離し、タグを使用して他のテンプレートに含めることができます。

これらは引数を取りませんが、変数が正しく設定されるようにメイン テンプレートをセットアップするか、{% 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 に答える