Нужно получить данные для полей выбора в цикле формы Django?
Поле выбора, требуемое в django, имеет следующий формат
new_choices = (
(1, 'Data 1'),
(2, 'Data 2'),
(3, 'Data 3'),
(4, 'Data 4'),
(5, 'Data 5'),
(6, 'Data 6'),
(7, 'Data 7'),
)
Я пытаюсь получить данные из базы данных, но данные не получаются должным образом
CHOICES = heads.objects.filter(brcd=self.n_brcd, status=1, acmast=1)
test =([('(' + str(p.head) + '-' + p.detail + ')') for p in CHOICES])
len_of_test = len(test)
new_choices =[]
for n in range(len_of_test):
new_choices = '(' + str(n) + "," + test[n] + ')'
Вывод, который я получаю из приведенного выше кода, следующий
new_choices = ['(0,(Data 0))','(1,(Data 1))','(2,(Data 2))',...]
необходимо получить результат, как показано ниже
new_choices = (
(1, 'Data 1'),
(2, 'Data 2'),
(3, 'Data 3'),
(4, 'Data 4'),
(5, 'Data 5'),
(6, 'Data 6'),
(7, 'Data 7'),
)
Вы можете построить список из двух кортежей с помощью:
CHOICES = heads.objects.filter(brcd=self.n_brcd, status=1, acmast=1)
new_choices = [
(i, f'{p.head}-{p.detail}')
for i, p in enumerate(CHOICES, 1)
]
Но заполнение данных из QuerySet
часто не является необходимым. Обычно ModelChoiceField
используется для выбора элемента для ForeignKey
.
Учитывая это, вы, вероятно, ищете ModelChoiceField
[Django-doc], который представляет собой ChoiceField
, заполненный набором запросов.
Как отмечает в комментарии Виллем Ван Онсем, в качестве ключей в списке выбора, вероятно, следует использовать идентификаторы баз данных вместо 0,1,...
Я бы использовал подход, подобный следующему:
qs = heads.objects.filter(brcd=self.n_brcd, status=1, acmast=1)
new_choices = []
for p in qs:
label = '(' + str(p.head) + '-' + p.detail + ')'
new_choices.append((p.id, label))