0

我有一个应用程序可以从我的视图中将“书”对象传递给模板。

如果正在传递“书”,我想自动将更多项目添加到模板上下文中。我不想为通过“书”的每个视图都这样做。

例如,如果“book”存在,则将与“books”相关的“other_books_user_read”添加到模板中。

我试图使用中间件来做到这一点,但如果“书”存在,我不知道如何检查上下文。

4

1 回答 1

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

于 2012-08-31T23:49:19.217 回答