ビューからテンプレートに「本」オブジェクトを渡すアプリがあります。
「本」が渡されている場合、テンプレートコンテキストにアイテムを自動的に追加したいと思います。「本」を通過するすべてのビューに対してそれを行いたくありません。
例えば、「book」が存在する場合、「books」に関連する「other_books_user_read」をテンプレートに追加します。
ミドルウェアを使用してこれを実行しようとしましたが、「本」が存在する場合にコンテキストを確認する方法がわかりません。
ビューからテンプレートに「本」オブジェクトを渡すアプリがあります。
「本」が渡されている場合、テンプレートコンテキストにアイテムを自動的に追加したいと思います。「本」を通過するすべてのビューに対してそれを行いたくありません。
例えば、「book」が存在する場合、「books」に関連する「other_books_user_read」をテンプレートに追加します。
ミドルウェアを使用してこれを実行しようとしましたが、「本」が存在する場合にコンテキストを確認する方法がわかりません。
この動作を行うテンプレート タグを作成するか、テンプレートでアクセスできるブック モデルにメソッドを配置することができます。
説明する最も簡単なものは次のとおりです。
class Book(Model):
def other_books_users_read(self):
return Book.objects.filter(...)
{{ book.other_books_users_read }}
テンプレートタグ: カスタムテンプレートタグがどのように機能するかを理解するのはあなたの責任ですが、基本的にコードは...
@register.assignment_tag
def get_other_books_users_read(book):
return Book.objects.filter(...) # logic here to get the books you need.
{% get_other_books_users_read book as other_books_users_read %}
{% for book in other_books_users_read %}
...
コンテキスト内でそれが本当に必要で、1 行のコード (およびドット) が多すぎる場合は、コンテンツをコンテキストに挿入するミドルウェアをセットアップできます。
https://docs.djangoproject.com/en/dev/topics/http/middleware/?from=olddocs#process-template-response
class MyMiddleware(object):
def process_template_response(self, request, response):
if 'book' in response.context_data:
response.context_data['other_books'] = Book.objects.filter(...)
return response
しかし、テンプレート内の book オブジェクトに文字通りアクセスできるため、テンプレートコンテキストミドルウェアを使用するのはばかげた方法です。