Сравнение Queryset внутри шаблона, возможно, с использованием пользовательской версии тега {% ifchanged%} - PullRequest
0 голосов
/ 21 июня 2011

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

class Tag(models.Model):
    # ...

class Paragraph(models.Model):
    tags = models.ManyToManyField(Tag)
    # ...

Внутри шаблона я перебираю набор запросов из Paragraph объектов, чтобы отобразить их, используя тег {% for %}. Мне также нужно отображать связанные теги, но только если они отличаются от предыдущей итерации. Это означает, что если я отображаю список из 5 абзацев, и первые четыре из них имеют идентичные теги, а пятый имеет разные теги, я хочу отображать теги только по первому и пятому абзацам.

Я пытался использовать встроенный тег {% ifchanged %}, но, как я понял, я не могу использовать {% ifchanged paragraph.tags.all %}, потому что он всегда будет возвращать True, даже если paragraph.tags.all содержит те же элементы.

Так что я думаю о том, чтобы увидеть собственный шаблонный тег {% iftagschanged %} в основании тега {% ifchanged %}, но с использованием другого метода сравнения, который сравнивает содержимое наборов запросов, состоящее из самих наборов запросов, которые всегда не совпадают. Проблема в том, что, глядя на тег {% ifchanged %} в исходном коде django , он выглядит немного сложным для меня, и я не могу понять, как изменить его для правильной работы в моем случае.

Так что я буду благодарен за совет или, возможно, идею любого другого решения.

1 Ответ

1 голос
/ 21 июня 2011

Создайте пользовательский метод в модели Paragraph, который возвращает связанные с ним теги в структуре данных, которую можно легко сравнить - скажем, с набором, - и используйте его в качестве аргумента для ifchanged.

class Paragraph(models.Model):
    def tags_as_set(self):
        return set(t.tag for t in self.tags.all())


{% ifchanged paragraph.tags_as_set %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...