Фильтр объектов внешнего ключа в шаблоне 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 %}