我有一个通过" book"从我的视角反对模板。
如果" book"我想自动在模板上下文中添加更多项目。正在通过。我不想为每个通过的视图做到这一点" book"。
e.g。如果"预订"存在,添加" other_books_user_read"关于"书籍"到模板。
我试图使用中间件来做这件事,但我无法弄清楚如何检查上下文,如果" book"存在。
答案 0 :(得分:0)
您可以创建一个执行此行为的模板标记,也可以在您的图书模型上放置一个可以在模板中访问的方法。
这是最简单的解释:
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认为使用模板上下文中间件是一种愚蠢的方式,因为你真的可以访问模板中的书籍对象。