django templatetag, получать сообщения, связанные с тегами тегов текущего сообщения

Я пишу блог с помощью django, и внизу записи в блоге я хочу отобразить 5 последних записей относительно тегов, которые я прикрепил с помощью django-taggit.

Итак, я решил, что мне нужно передать текущую запись в блоге (тот, который мы просматриваем) в тег шаблона, который будет извлекать записи с теми же тегами taggit или достаточно близко. Но давайте начнем с простого и скажем, извлекаем записи, которые разделяют первый taggit-tag.

вот что я придумал:

from django.template import Library, Node
from django import template
from blog.models import Entry

register = Library()

class RecentContentNode(Node):
    def __init__(self, num, object, varname):
        self.object = template.Variable(object)
        self.num, self.varname = num, varname

    def render(self, context):
        object = self.object.resolve(context)
        tag_list = object.tags.all()
        tag_names = tag_list[0].name
        context[self.varname] = Entry.objects.filter(tags__name__in=[tag_names])[:self.num]
        return ''

@register.tag
def get_recent_related(parser, token):
    bits = token.contents.split()
    if len(bits) != 5:
        raise TemplateSyntaxError, "get_latest_entries tag takes exactly four arguments"
    if bits[3] != 'as':
        raise TemplateSyntaxError, "fourth argument to the get_recent tag must be 'as'"
    return RecentContentNode(bits[1], bits[2], bits[4])

Но это ничего не делает. Проходя через него с оператором печати, я вижу, что он попадает в RecentContentNode через инициализацию, но не в метод рендеринга. Я не получаю никаких ошибок или предупреждений, поэтому я не знаю, что происходит. Но я думаю, что проблема заключается в переменной / разрешении, так как я вижу других людей в сети, имеющих аналогичные проблемы, но они часто отвечают на сообщение, говоря, что они исправили это, но не как, поэтому я не мудрее.

Что-то очевидное я пропустил? или есть способ лучше..


person mXed    schedule 11.08.2011    source источник


Ответы (1)


Вы можете передать список непосредственно в контексте. Если вы используете общие представления на основе классов, передайте

def get_context_data(self, **kwargs):
    context_data = super(EntryView, self).get_context_data(**kwargs)
    related_entries = Entry.objects.filter(
        tags__name__in=list(self.object.tags.values_list('name', flat=True))
    ).exclude(id=self.object.id)
    context_data['related_entries'] = related_entries
    return context_data

https://docs.djangoproject.com/en/dev/topics/class-based-views/#adding-extra-context

Вы должны добавлять это только в представления, где вам это действительно нужно, и адаптировать к тому, что вам нужно отображать, а не слепо добавлять это в контексте любого представления, каким бы оно ни было.

person rewritten    schedule 12.08.2011
comment
Работает отлично, но скажите мне, почему я должен быть осторожен, используя этот метод? Есть ли в этом угроза безопасности? или это добавляет слишком много дополнительных запросов к базе данных/накладных расходов? - person mXed; 12.08.2011
comment
Дело наверху. Если вы можете выбрать, следует ли включать related_entries на основе некоторой контекстной информации, вы сэкономите один или два запроса. - person rewritten; 12.08.2011