Найти - Пользователи
Полная версия: [Решено] Помогите сгруппировать данные при выводе на фронт-енд.
Начало » Django » [Решено] Помогите сгруппировать данные при выводе на фронт-енд.
1
TitanFighter
Добрый день

На данный момент есть такой код
#show.html
    {% for showtime in showtimes %}
        <div class="row">
            <div class="medium-11 medium-centered columns">
                <div class="panel callout radius">
                    Кинотеатр: {{ showtime.showtime_place }}<br>
                    Дата: {{ showtime.showtime_dates }}<br>
                    Время: {{ showtime.showtime_times }}<br>
                    Формат: {{ showtime.showtime_format }}<br>
                </div>
            </div>
        </div>
    {% endfor %}
который выводит информацию в таком виде:


Подскажите, как сделать так, чтоб вывод был как тут http://vkino.com.ua/show/3667/?city=kiev#!=&cinema=&date=
т.е группировка по Кинотеатру, потом подгруппировка по дате?

#models.py
class Showtime(models.Model):
    showtime_dates = models.CharField('Date', max_length=30)
    showtime_times = models.CharField('Time', max_length=30)
    showtime_format = models.CharField('Format', max_length=4, blank=True)
    showtime_place = models.ForeignKey('app_places.place', verbose_name='Place')
    showtime_show = models.ForeignKey(Show, verbose_name='Show name')

#views.py
def show(request, show_id=1):
    return render_to_response('app_shows_and_times/show.html',
                            {'show': Show.objects.get(id=show_id),
                            'showtimes': Showtime.objects.filter(showtime_show_id=show_id)})

Формат записей в БД в подобном виде
ID…|……………..Date………………|…….Time | Format | showtime_place_id | showtime_show_id
122,“30 августа, сегодня”, .|……19:00,…..2D,…………………2,…………………….5
123,“30 августа, сегодня”, .|……23:20,…..2D,…………………2,…………………….5
124,“31 августа, понедельник”,|.12:20,…..2D,…………………2,…………………….5
125,“31 августа, понедельник”,|.17:00,…..2D,…………………2,…………………….5

Пробовал применить regroup, по аналогии с примером из документации
   {% regroup showtimes by showtime.showtime_place as cinema_place %}
    <ul>
        {% for showtime.showtime_place in cinema_place %}
            <li>
                {{ showtime.showtime_place.grouper }}
                    <ul>
                        {% for item in showtime.showtime_place.list %}
                            <li>
                                {{ item.showtime.showtime_dates }}: {{ item.showtime.showtime_times }}
                            </li>
                        {% endfor %}
                    </ul>
            </li>
        {% endfor %}
    </ul>
но расписание в данном случае не отображается.
lead-in
Почему не пробовали стандартные методы QuerySet https://docs.djangoproject.com/en/1.8/ref/models/querysets/#order-by ?
Или пробовали и не получилось?
TitanFighter
Не думал я в контексте данной задачи про QuerySet (небольшой еще опыт работы с ним). После вашего сообщения перечитал еще раз весь раздел про QuerySet, особенно про order_by - честно, не понял, как его применить к моей задаче. Ордер ведь сортирует, а мне нужно сгруппировать.

Т.е. было вот так (Скажем на примере сеансов Трансформеры 5 в 2х разных кинотеатрах):
Кинотеатр Линия Кино
Дата 1.1.15
Время 10:00

Кинотеатр Линия Кино (тот же самый кинотеатр)
Дата 1.1.15 (та же самая дата)
Время 12:30

Кинотеатр Караван
Дата 1.1.15
Время 10:00

Кинотеатр Караван (кинотеатр такой же, как и предыдущий)
Дата 1.1.15 (та же самая дата)
Время 13:00

Кинотеатр Караван (кинотеатр такой же, как и предыдущий)
Дата 5.1.15 (!новая дата)
Время 13:00

А нужно было сделать так:
Кинотеатр Линия Кино
>Дата 1.1.15
-> 10:00
-> 12:30

Кинотеатр Караван
> Дата 1.1.15
-> 10:00
-> 13:00
> Дата 5.1.15
-> 13:00

Вообщем, удалось мне сделать через regroup в шаблоне. Моя первоначальная ошибка была, что я обращался к классу_модели.полю_модели, а нужно было просто к полю_модели.

    {% regroup showtimes by showtime_place as cinema_places %}
    <ul>
        {% for cinema in cinema_places %}
            <li>
                {{ cinema.grouper }}
                <ul>
                    {% regroup cinema.list by showtime_dates as cinema_dates %}
                    {% for date in cinema_dates %}
                        <li>
                            {{ date.grouper }}
                            <ul>
                                {% for time in date.list %}
                                    <li>
                                        {{ time.showtime_times }}
                                    </li>
                                {% endfor %}
                            </ul>
                        </li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
    </ul>

Возможно это не самый оптимальный вариант. Я ведь только учусь Если есть оптимальней\правильней\православней варианты, рад буду поучиться.

Спасибо.
TitanFighter
Прошу еще чуть помощи.

    {% regroup showtimes by showtime_place as cinema_places %}
    <ul>
        {% for cinema in cinema_places %}
            <li>
# Из {{ cinema.grouper }} я хочу сделать ссылку, 
# но  {{ showtime_place_id}} я могу получить только из цикла ниже {% for time in date.list %},
# так как в data.list находятся данные всех полей, если я правильно понимаю
                <a href="cinema/{{ showtime_place_id}}">{{ cinema.grouper }}</a> 
                <ul>
                    {% regroup cinema.list by showtime_dates as cinema_dates %}
                    {% for date in cinema_dates %}
                        <li>
                            {{ date.grouper }}
                            <ul>
                                {% for time in date.list %}
                                    <li>
                                        {{ time.showtime_times }}
                                    </li>
                                {% endfor %}
                            </ul>
                        </li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
    </ul>

Подскажите, как перестроить правильно код, чтоб из названия кинотеатра сделать ссылку на подробное описание этого кинотеатра?
TitanFighter
Достаточно было в модель, отвечающую за инфо по кинотеатрам, засунуть
    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        return reverse('app_places.views.cinema', args=[str(self.id)])

в итоге {{ cinema.grouper }} превратился в <a href=“{{ cinema.grouper.get_absolute_url }}”>{{ cinema.grouper }}</a>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB