有什么方法可以将值从视图传递给自定义context_processor函数?

时间:2019-04-25 10:16:18

标签: django related-content

我正在尝试显示相关帖子,相关性基于类别。 帖子模型具有类别模型的外键。

有没有更好的方法可以做到这一点? 目前,我正在使用会话从single_post_detail_view发送category_name到自定义context_processor函数,然后该函数返回与该类别相关的帖子。

views.py

class PostDetailView(DetailView):
    def get(self, request, slug):
        post = Post.objects.get(slug=self.kwargs['slug'])
        context = {
            'post' : post
        }
        request.session['category'] = post.category.name
        return render(request, 'blog/post_detail.html', context)

context_processors.py

from blog.models import Category

def related_posts(request):
    if request.session['category']:
        category = request.session['category']
    return {
        'related_posts': Category.objects.get(name=category).posts.all()
    }

然后使用HTML

{% for post in related_posts %}
   <a href="post.get_absolute_url()">{{post.title}}</a>
{% endfor %}

1 个答案:

答案 0 :(得分:1)

上下文处理器旨在为每个请求运行。如果您需要将信息传递给它,则表明您不应该使用上下文处理器。

您可以使用辅助功能

def related_posts(category):
    return category.posts.all()

然后将帖子手动添加到视图中的上下文中:

    context = {
        'post': post,
        'related_posts': related_posts(post.category)
    }

或者您可以编写自定义模板标签。

simple tag可以帮助您:

{% related_posts post.category as related_posts %}
{% for post in related_posts %}
    ...
{% endfor %}

或者也许您可以使用inclusion tag来呈现链接:

{% related_posts post.category %}