Вы правильно поняли, для зависимых моделей в главной модели создаются RelatedManager'ы с именем ‘<зависимая_модель>_set’. Например, чтобы получить интересующие нас данные в консоли, мы можем сделать так:
for project in Projects.objects.all():
print('Title: ', project.title)
print('Description: ', project.description)
for preview in project.preview_set.all():
print('\tImage title: ', preview.title)
print('\tImage path: ', preview.image)
Соответственно, чтобы вывести всё с помощью шаблонизатора, нам нужно переписать это на языке шаблонизатора:
{% for project in project_list %}
<h2>{{ project.title }}</h2>
<p>{{ project.description }}</p>
{% for preview in project.preview_set.all %}
<h3>{{ preview.title }}</h3>
<img src="{{ preview.image }}">
{% endfor %}
{% endfor %}
Остаётся только передать модель в контекст шаблонизатора:
def portfolio(arg):
ctx = {
'project_list': Project.objects.all(),
}
return render(arg, 'portfolio.html', ctx)
С тегами всё аналогично, не стал усложнять ответ.