Есть ли способ передать значение пользовательской функции context_processor из представления? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь показать похожие посты, родство основано на категории.У пост-модели есть внешний ключ к модели категории.

Есть ли лучший способ сделать это.В настоящее время я отправляю имя_категории из single_post_detail_view, используя сеанс, в пользовательскую функцию 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 Ответ

1 голос
/ 25 апреля 2019

Контекстный процессор предназначен для запуска для каждого запроса. Если вам необходимо передать информацию, это означает, что вам не следует использовать контекстный процессор.

Вы можете использовать вспомогательную функцию,

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

затем вручную добавьте сообщения в контекст в представлении:

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

Или вы можете написать собственный тег шаблона.

A простой тег позволит вам сделать:

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

Или, возможно, вы можете использовать тег включения для рендеринга ссылок:

{% related_posts post.category %}
...