Нужно получить данные для полей выбора в цикле формы 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))
Вернуться на верх