Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » [Решено] Помогите сгруппировать данные при выводе на фронт-енд. [RSS Feed]

#1 Сен. 3, 2015 17:48:04

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Помогите сгруппировать данные при выводе на фронт-енд.

Добрый день

На данный момент есть такой код

#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>
но расписание в данном случае не отображается.

Отредактировано TitanFighter (Сен. 6, 2015 22:59:09)

Офлайн

#2 Сен. 3, 2015 20:18:52

lead-in
Зарегистрирован: 2014-10-13
Сообщения: 19
Репутация: +  5  -
Профиль   Отправить e-mail  

[Решено] Помогите сгруппировать данные при выводе на фронт-енд.

Почему не пробовали стандартные методы QuerySet https://docs.djangoproject.com/en/1.8/ref/models/querysets/#order-by ?
Или пробовали и не получилось?

Офлайн

#3 Сен. 4, 2015 01:34:43

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Помогите сгруппировать данные при выводе на фронт-енд.

Не думал я в контексте данной задачи про 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 (Сен. 4, 2015 01:44:32)

Офлайн

#4 Сен. 4, 2015 17:38:25

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Помогите сгруппировать данные при выводе на фронт-енд.

Прошу еще чуть помощи.

    {% 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 (Сен. 4, 2015 18:10:10)

Офлайн

#5 Сен. 6, 2015 22:58:12

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Помогите сгруппировать данные при выводе на фронт-енд.

Достаточно было в модель, отвечающую за инфо по кинотеатрам, засунуть

    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>

Отредактировано TitanFighter (Сен. 6, 2015 22:58:26)

Офлайн

  • Начало
  • » Django
  • » [Решено] Помогите сгруппировать данные при выводе на фронт-енд.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version