2016-10-10 3 views
1

Прежде всего, правильно ли я понимаю, что теги Django фактически являются миниязыком для себя и что Python не будет работать в них?Работа с зависимыми объектами в шаблонах Django

Если да, то как мне обращаться со значениями, которые было бы трудно для предварительного просмотра представления? Для, например, это то, что я хочу сделать (пользователь имеет много оценок):

{% for user in users %} # Where users are defined in the view/context 
    ... 
{% endfor %} 

Тогда внутри, что я попробовал несколько вещей

{% for rating in user.ratings %} 

или

{% for rating in Rating.objects.filter(user=user) %} 

Бывший никогда не выполняет итерации. Последнее является отвратительным и в любом случае не работает - он поднимает TemplateSyntaxError at/Could not parse the remainder

Но поскольку только пользователи посещают только пользователей, которым я получаю соответствующий фильтр, я не уверен, как я создаст второй запрос QuerySet в представлении.

Какой лучший подход здесь?

ответ

2

Вы правы, что вы не можете запускать произвольный Python в шаблоне: синтаксис определяется системой шаблонов, по умолчанию это Django template language (DTL).

В вашем конкретном случае есть простой способ получить доступ к отношениям внешнего ключа объекта модели: используйте ключевое слово _set. Следующие должны работать:

{% for rating in user.rating_set.all %} 
<!-- do stuff with rating --> 
{% endfor %} 

При поиске только item.ratings, он ожидает ratings быть поля модели. Вам необходимо указать _set, чтобы направить его на модели иностранных ключей.

Этот случай прост: в других случаях лучшим вариантом является запуск логики в представлении и передача переменной в контекст шаблона или (нетривиальный) для создания собственного тега шаблона.

0

Вы должны использовать _set.all

{% for user in users %} # Where users are defined in the view/context 
    {% for rating in user.rating_set.all %} 
     ... 
    {% endfor %} 
{% endfor %} 

Если у вас есть фильтрация see this.

Смежные вопросы