Поле выбора заказа Django - PullRequest
0 голосов
/ 21 мая 2018

Я боролся с полями выбора Django в форме.У меня есть выбор в файле forms.py и поле выбора радио.

DURATION_CHOICES = {
    (1, '30'),
    (2, '45'),
    (3, '60'),
    (4, '75'),
    (5, '90'),
    (6, '105'),
    (7, '120+'),
}

duration = forms.ChoiceField(choices=DURATION_CHOICES, widget=forms.widgets.RadioSelect, label_suffix="", label="Trainingsdauer in Minuten",)

Однако, когда я открываю форму для создания нового сеанса обучения, поле выбора радио продолжительности упорядочивается случайным образом, т. Е. 105 находится всписок до 45. Порядок даже меняется с тестирования устройств на другое

У меня та же проблема с полями выбора из models.py

Я уже заказал свой выбор, но как мне получитьупорядоченный список выбора в моей форме?

1 Ответ

0 голосов
/ 21 мая 2018

Я думаю, что это больше проблема с коллекцией, которую вы используете.Вы здесь используете фигурные кавычки ({}) .Это set.Набор неупорядоченных коллекций хэшируемых элементов, которые встречаются ноль или один раз.Но, как сказано, коллекция неупорядочена.Это означает, что нет никаких гарантий, если вы перечислите коллекцию в том порядке, в каком вы ее получите.

Используйте список или кортеж

Я думаю, вам лучше использовать list или tuple здесь, который представляет собой упорядоченный набор элементов.Для списков вы можете использовать квадратные скобки ([]), для кортежей - круглые скобки (()):

DURATION_CHOICES = <b>[</b>
    (1, '30'),
    (2, '45'),
    (3, '60'),
    (4, '75'),
    (5, '90'),
    (6, '105'),
    (7, '120+'),
<b>]</b>

Сортировать коллекцию перед тем, как передать ее в качестве аргумента

Если вы хотите продолжать использовать набор, мы можем преобразовать его в список, прежде чем добавлять его в поле.Например, мы можем использовать sorted(..) для сортировки по первому элементу кортежа:

from operator import itemgetter

duration = forms.ChoiceField(
    choices=<b>sorted(DURATION_CHOICES, key=itemgetter(0))</b>,
    widget=forms.widgets.RadioSelect,
    label="Trainingsdauer in Minuten",
)

Обратите внимание, однако, что если вы сделаете изменения в наборе DURATION_CHOICES, эти изменения не будут отражается в ChoiceField, поскольку мы здесь сделали поверхностную копию списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...