Странное поведение в выпадающем списке select в шаблоне Django - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над двумя связанными полями формы (Class и Students), где пользователь выбирает класс из раскрывающегося меню, а затем обновляет поле формы студентов с соответствующим списком студентов.

У меня все это работает с логикой AJAX, кроме ... кроме ... Я столкнулся с некоторым странным поведением при попытке применить атрибут selected к тегам <option>.

views.py

def load_students(request):
    classid = request.GET.get('classid')
    contractid = request.GET.get('contractid')

    # Lookup students for given class
    students = Student.objects.getclass(classid=classid) 

    if(contractid):

         # Generate list of students associated with this contract
        contract_party_list = []
        contract_parties = ContractParty.objects.get_contract_parties(
            contractid=contractid
        )

        for mycontractparty in contract_parties:
            contract_party_list.append(mycontractparty.partyuserid)

        # Generate new student list (with appended contract user info)
        student_list = []

        for mystudent in students:
            # Set flag to determine whether student is part of contract
            if(mystudent.studentuserid in contract_party_list):
                selectedFlag = True
            else:
                selectedFlag = False

            # Add updated student info to new student list
            student_list.append(
                {
                    'studentuserid':mystudent.studentuserid, 
                    'firstname':mystudent.firstname, 
                    'lastname':mystudent.lastname, 
                    'selectedFlag': selectedFlag
                }
            )

        students = student_list

    return render(request, 'dropdown_ajax.html', {'students': students})

dropdown_ajax.html

{% if students %}
{% for student in students %}
    <option 
        value="{{ student.studentuserid }}" 
        {% if student.selectedFlag %} selected="selected"{% endif %}
    >
        {{ student.firstname }} {{ student.lastname }}
    </option>
{% endfor %}
{% endif %}

Эта строка вызывает у меня проблемы: {% if student.selectedFlag %} selected="selected"{% endif %}

Странное поведение заключается в том, что атрибут «выбранный» никогда не применяется, даже если student.selectedFlag имеет значение True.

Пара вещей, которые я пробовал:

  1. Я переместил строку выше тега, чтобы посмотреть, что он будет делать. Для правильного ввода отображается текст «выбрано».

  2. Я заменил if student.selectedFlag на if student.studentuserid == 1, и в поле был выбран правильный студент.

  3. Я передал "True" / "Ложные и числовые значения для selectedFlag вместо логического значения. Я попытался if student.selectedFlag == "True". Ничего.

Я не уверен, что вызывает такое поведение. Полагаю, это связано с тем, что булевы переменные Django не корректно вычисляются в полях <option>.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Как обычно ... решение проявляется после перерыва :) Это официально ... Я идиот. В моем тестировании я рассматривал два разных сценария. Тот, который давал мне «странное поведение», я не передавал значение contractid. Так что никогда не доходило до логики, которая устанавливает параметры selected. D'о! Спасибо за советы.

0 голосов
/ 03 июля 2018

Я не думаю, что это проблема с django - это проблема с html. Атрибут html должен рассматриваться как логическое значение (присутствует / не присутствует), а не значение «выбрано». Правильно отображенный HTML должен выглядеть примерно так:

<option value="value" selected>...</option>

не это, что я думаю, что происходит в вашем:

<option value="value" selected="selected">...</option>

Таким образом, исправленный код будет выглядеть так:

dropdown_ajax.html

{% if students %}
{% for student in students %}
    <option 
        value="{{ student.studentuserid }}" 
        {% if student.selectedFlag %} selected{% endif %}
    >
        {{ student.firstname }} {{ student.lastname }}
    </option>
{% endfor %}
{% endif %}
...