Фильтр объектов внешнего ключа в шаблоне django

У меня есть следующая модель, которая используется для "архивирования" сообщения (т.е. если она создана для сообщения пользователя, то это сообщение теперь скрыто от этого пользователя)

models.py

class ArchivedFlag(models.Model):
    group = models.ForeignKey(Group,
                             on_delete=models.CASCADE,
                             related_name='archived_commits')
    post = models.ForeignKey(Commit,
                             on_delete=models.CASCADE,
                             related_name='archived_flag')
    user = models.ForeignKey(User,
                             on_delete=models.CASCADE,
                             related_name='archives')

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

template.html

{% for p in posts %}

<form action="{% url 'archive_commit' c.oid %}" method="post">
    {% csrf_token %}
    <input type="hidden" name="next" value="{{ request.get_full_path }}">

    {% if <...an archived flag exists with post==post and group==user.group...> %}
        <...Do stuff for archived post...>
        <button type="submit", name="c_oid", value="{{ c.oid }}", class="btn btn-primary btn-sm">Restore</button>
    {% else %}
        <...do stuff for unarchived post...>
        <button type="submit", name="c_oid", value="{{ c.oid }}", class="btn btn-primary btn-sm">Archive</button>
    {% endif %}

</form>
{% endfor %}

Есть ли способ сделать это в шаблоне django? Я не могу найти никакой информации о фильтрации в шаблоне, так что, возможно, это невозможно.

Вы не можете фильтровать/запрашивать в шаблоне Django.

Но если вы дадите вашей модели Commit метод модели свойств, например is_archived, вы сможете использовать его в условном условии.

Документация по методам модели находится здесь: https://docs.djangoproject.com/en/3.2/topics/db/models/#model-methods

Таким образом, ваша модель Commit может иметь свойство, возвращающее булево значение, выглядящее следующим образом:

@property
def is_archived(self):
    return <however you know it's archived>

Тогда вы можете использовать шаблон, указанный в вашем вопросе, следующим образом:

{%for post in posts %}
  {% if post.is_archived %}
    do a thing
  {% else %}
    do a different thing
  {% endif %}
{% endfor %}
Вернуться на верх