Как добавить выбор из вида? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь динамически заполнить два поля выбора формы, а именно 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 

Когда я получаю доступ к представлению, шаблон отображается нормально, все доступные варианты отображаются правильно.

enter image description here

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

enter image description here

Запустив некоторые (очень базовые 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)

1 Ответ

1 голос
/ 18 февраля 2020

Вы переинициализируете форму


print(form.fields['person'].choices)
<b>form = AssignWorkToPerson(request.POST)</b>

if form.is_valid():

Это должно быть так


   if request.method == 'POST':
        <b>form = AssignWorkToPerson(request.POST)</b>
        # skipped
        form.fields['person'].choices = person_choices  
        if form.is_valid():
            pass

form = AssignWorkToPerson(request.POST) должно быть сверху сразу после проверки метода, а не в конце.

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