我有一个应用程序可以从我的视图中将“书”对象传递给模板。
如果正在传递“书”,我想自动将更多项目添加到模板上下文中。我不想为通过“书”的每个视图都这样做。
例如,如果“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 %}
...
现在,如果你真的想要它在上下文中,而一行代码(和一个点)工作量太大,你可以设置一个将内容注入上下文的中间件。
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 使用模板上下文中间件是一种愚蠢的方式,因为您实际上可以访问模板中的书籍对象。