0
我有一個將「book」對象從我的視圖傳遞到模板的應用程序。如果模板中存在項目,自動添加更多項目
如果正在傳遞「book」,我想自動向模板上下文中添加更多項目。我不想爲所有通過「書」的觀點去做。
例如如果「book」存在,則將與「books」有關的「other_books_user_read」添加到模板中。
我正在嘗試使用中間件來做到這一點,但我無法弄清楚如果「book」存在時如何檢查上下文。
我有一個將「book」對象從我的視圖傳遞到模板的應用程序。如果模板中存在項目,自動添加更多項目
如果正在傳遞「book」,我想自動向模板上下文中添加更多項目。我不想爲所有通過「書」的觀點去做。
例如如果「book」存在,則將與「books」有關的「other_books_user_read」添加到模板中。
我正在嘗試使用中間件來做到這一點,但我無法弄清楚如果「book」存在時如何檢查上下文。
您可以製作一個模板標籤來完成此行爲,或者您可以將一種方法放在您可以在模板中訪問的書模型上。
這裏是最簡單的解釋:
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 %}
...
現在,如果你真的想在上下文中使用它,並且一行代碼(和一個點)工作太多,可以設置一個將內容注入上下文的中間件。
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
但IMO這是使用模板的上下文中間件,因爲你從字面上有機會獲得一本書對象在模板中一個愚蠢的方式。