Группировка дат в Django [дубликат]

Существует два правила для записи веб-сайтов:

  1. сайт должен работать на Ваших пользователей.
  2. сайт должен работать на Ваших пользователей.

Для соблюдения первого правила необходимо кодировать таким образом, что сайт представляет правильно при использовании Internet Explorer. Если у Вас нет свободы изменить Ваш дизайн сайта для использования только тех функций, которые IE представляет правильно, это означает писать недопустимый HTML.

Для соблюдения второго правила необходимо кодировать таким образом, что сайт представляет правильно при использовании для слепых экранов и программ экранного доступа. Хотя некоторые более новые программы экранного доступа могут работать с предназначенными IE сайтами, в целом это означает писать допустимый HTML.

, Если Вы работаете над маленьким проектом, или Вы - часть многочисленной команды, можно кодировать сайт что выводы предназначенный IE HTML для IE и допустимый HTML иначе. Но если Вы берете средний и крупный проект самостоятельно, необходимо решить, за каким правилом Вы собираетесь следовать и какой Вы собираетесь проигнорировать.

ОБНОВЛЕНИЕ:

Это становится проваленным пользователями, которые думают, что можно всегда сходить с рук допустимый HTML в IE. Это может быть верно, если у Вас есть гибкость для изменения дизайна для обхождения недостатков IE, но если клиент дал Вам дизайн, и необходимо получить его работа, Вам, вероятно, придется обратиться к недопустимому HTML. Это печально, но это верно, независимо от того, что они могли бы думать.

15
задан Community 23 May 2017 в 12:10
поделиться

4 ответа

Вы можете решить эту проблему с помощью перегруппировки и дата теги шаблонов.

{% regroup object_list by start_date|date:"Y-m-d" as objects_by_day %}
{% for d in objects_by_day %}
### DO SOMETHING HERE
{% endfor %}
31
ответ дан 30 November 2019 в 23:57
поделиться

itertools.groupby - ваш дорогой, дорогой друг:

import itertools

dates = [
   (1,'2009-01-01 10:15:23'),
   (2,'2009-01-01 13:21:29'),
   (3,'2009-01-02 01:03:13'),
   (4,'2009-01-03 12:20:19'),
   (5,'2009-01-03 13:01:06'),
]

for key,group in itertools.groupby(dates, key=lambda x: x[1][:11]):
   print key
   for element in group:
      print '   ', element

Приведенный выше код печатает следующее:

2009-01-01 
    (1, '2009-01-01 10:15:23')
    (2, '2009-01-01 13:21:29')
2009-01-02 
    (3, '2009-01-02 01:03:13')
2009-01-03 
    (4, '2009-01-03 12:20:19')
    (5, '2009-01-03 13:01:06')
15
ответ дан 30 November 2019 в 23:57
поделиться

Это все разумные ответы, если OP может использовать python в коде шаблона. (И в этой связи я бы предпочел решение itertools.groupby ().) Но вы не можете использовать python в коде шаблона. В лучшем случае вы должны написать тег шаблона, который выполняет эту операцию. И уже есть тег шаблона, который делает это.

Чтобы выполнить группировку в Django внутри шаблона, используйте regroup :

{% regroup people by gender as gender_list %}

<ul>
{% for gender in gender_list %}
    <li>{{ gender.grouper }}
    <ul>
        {% for item in gender.list %}
        <li>{{ item.first_name }} {{ item.last_name }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

Пример взят из документации по перегруппировке Django . regroup доступна в django 0.96 , 1.0 и 1.1 , по крайней мере.

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

Кроме того, есть сообщение в блоге , в котором DjangoGrrl решает именно этот вопрос.

8
ответ дан 30 November 2019 в 23:57
поделиться

Это было бы проще, если бы вы использовали функции форматирования даты своей базы данных, чтобы убрать время (в выбранном). Затем вы можете группировать по отформатированному столбцу (используя псевдоним столбца).

После этого вы можете использовать цикл с небольшой логикой, чтобы преобразовать результаты в то, что вы хотите. Я еще не использовал систему шаблонов django, но вот как будет выглядеть логика в Python:

>>> rows = [(1,'2009-01-01'), (2,'2009-01-01'), (3, '2009-02-02'), \
(4, '2009-02-02'), (5, '2009-02-02')]
>>> topdate = None
>>> for r in rows:
...     if topdate <> r[1]:
...             topdate = r[1]
...             print r[1]
...     print r[0]
... 
2009-01-01
1
2
2009-02-02
3
4
5

Должен быть простой способ преобразовать это в код шаблона django.

2
ответ дан 30 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: