Я пытаюсь динамически заполнить два поля выбора формы, а именно person
и work
.
Представление под названием assign_work_to_person
должно позволить пользователю выбрать человека, работа, которая не имеет еще не было назначено человеку, и после отправки формы выбранная работа должна быть связана с выбранным человеком (например, «Леонардо да Винчи» должен быть связан с «Мона Лизой»).
Что я делаю создает класс формы с пустым выбором для двух полей
class AssignWorkToPerson(forms.Form):
person = forms.ChoiceField()
work = forms.ChoiceField()
, а затем извлекает доступных лиц и авторские работы для заполнения полей формы при доступе пользователя к представлению assign_work_to_person
.
Я пытаюсь динамически настроить эти варианты следующим образом:
form.fields['the_field_name'].choices = a_list_of_tuples
Когда я получаю доступ к представлению, шаблон отображается нормально, все доступные варианты отображаются правильно.
Проблема в том, что когда я отправляю форму, она вызывает ошибки проверки для обоих полей, предлагая мне выбрать правильный выбор.
Запустив некоторые (очень базовые c печать) тесты, я понял, что попытка заполнить поля таким образом, фактически не добавляет варианты даже если они есть в шаблоне. Фактически, как вы можете видеть из второго рисунка, после того, как я отправил форму, шаблон отображает форму без доступных вариантов.
Как я могу сделать эту работу?
Я знаю из других ответов на аналогичные вопросы, что это можно сделать, указав метод __init__
в модели (в моем случае, я полагаю, в форме), а затем установив выбор с помощью аргумента ключевого слова queryset, но я бы лучше сделал это в представлении, если это возможно.
Редактировать
def assign_work_to_person(request):
form = AssignWorkToPerson()
persons = Person.objects.all()
person_choices = []
for person in persons:
person_choices.append((person.first_name + ' ' + person.last_name, person.first_name + ' ' + person.last_name))
form.fields['person'].choices = person_choices
works = Work.objects.all()
work_choices = []
for work in works.filter(author=None):
work_choices.append((work.name, work.name))
form.fields['work'].choices = work_choices
if request.method == 'POST':
persons = Person.objects.all()
person_choices = []
for person in persons:
person_choices.append(
(person.first_name + ' ' + person.last_name, person.first_name + ' ' + person.last_name))
form.fields['person'].choices = person_choices
works = Work.objects.all()
work_choices = []
for work in works.filter(author=None):
work_choices.append((work.name, work.name))
form.fields['work'].choices = work_choices
print(form.fields['person'].choices)
form = AssignWorkToPerson(request.POST)
if form.is_valid():
print('THIS FORM CONTAINS VALID DATA')
template_name = 'assign_work_to_person.html'
context = {'form': form}
return render(request, template_name, context)