Django 如果模板中存在项目,则自动添加更多项目

Django 如果模板中存在项目,则自动添加更多项目,django,Django,我有一个应用程序,它将“book”对象从我的视图传递到模板 如果传递“book”,我想自动向模板上下文添加更多项。我不想对每一个通过“书”的视图都这样做 e、 g.如果存在“书籍”,则将与“书籍”相关的“其他书籍\用户\阅读”添加到模板中 我试图使用中间件来实现这一点,但我不知道如何检查“book”是否存在的上下文。您可以制作一个模板标记来实现此行为,或者您可以在您的book模型上放置一个方法,您可以在模板中访问该方法 下面是最简单的解释: class Book(Model): def o

我有一个应用程序,它将“book”对象从我的视图传递到模板

如果传递“book”,我想自动向模板上下文添加更多项。我不想对每一个通过“书”的视图都这样做

e、 g.如果存在“书籍”,则将与“书籍”相关的“其他书籍\用户\阅读”添加到模板中


我试图使用中间件来实现这一点,但我不知道如何检查“book”是否存在的上下文。

您可以制作一个模板标记来实现此行为,或者您可以在您的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 %}
...
现在,如果您真的想在上下文中使用它,并且一行代码(和一个点)太多了,那么您可以设置一个中间件,将内容注入到上下文中

但在我看来,使用模板上下文中间件是一种愚蠢的方式,因为您实际上可以访问模板中的book对象

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