cachealot
@cachealot

Django, отношения, связь трех таблиц, вопрос новичка

День добрый
плавно перехожу с php на django.
После нескольких консультаций у психологов, появились вопросы по существу:

Хочу реализовать свою фотогаллерею с, ну вы поняли с чем
Имеем
Категорию
Галлерея
Фотографии

Хочу сделать вывод вида:

Название категории
 Фотогаллерея
   Фото
   Фото
Название категории
 Фотогаллерея
  Фото
  Фото
Название категории
 Фотогаллерея
  Фото
  Фото


Что приходит на ум:

def index(request):
    gallery = Gallery.objects.all().order_by('created')
    photos = {}

    for gal in gallery:
        p = port.photos.all()
        if(len(p)):
            photos[gal.category] = []
            photos[gal.category].append((gal, p))


и бегать по массиву photos, но как в шаблоне сделать
for category in photos
for x,y in photos[category]
?

неужели нужно делать
photos.append((gal.category, gal, p))

??
  • Вопрос задан
  • 3001 просмотр
Решения вопроса 1
un1t
@un1t
в шаблоне должно выглядеть как-то так
{% for gallery in galleries %}
gallery.photo_set.all
{% endfor %}

не пробовал, но вроде должно работать
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
homm
@homm
Просто выберете все нужные фотографии с select_related для галлерей и категорий, а в шаблне сгрупируйте их используя тег regroup.
Ответ написан
un1t
@un1t
Попробуйте так
во view
galleries = Gallery.objects.all().order_by('created')

в шаблоне:
for gallery in galleries:
gallery.photo_set().all().order_by('created')

дока с примерами тут: docs.djangoproject.com/en/1.2/topics/db/queries/
Ответ написан
savados
@savados
На вопрос вам ответили, еще пара вещей на будущее:

1. Используйте related_name. Тогда вместо gallery.photo_set.all можно будет писать gallery.photos.all (или любое другое название, которое вам понравится).
2. Задавайте сортировку в Meta.
3. Тут можно вообще не писать view, а использовать direct_to_template.
4. Если нужно делать однотипные выборки (типа 10 последних записей, отсортированных по дате), то лучше вынести эти действия в отдельный менеджер и вызывать именно его. Инкапсуляция и все такое. :-)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы