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

时间:2012-08-31 22:10:51

标签: django

我有一个通过" book"从我的视角反对模板。

如果" book"我想自动在模板上下文中添加更多项目。正在通过。我不想为每个通过的视图做到这一点" book"。

e.g。如果"预订"存在,添加" other_books_user_read"关于"书籍"到模板。

我试图使用中间件来做这件事,但我无法弄清楚如何检查上下文,如果" book"存在。

1 个答案:

答案 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认为使用模板上下文中间件是一种愚蠢的方式,因为你真的可以访问模板中的书籍对象。