Django - выбор из __init__ не загружается в форму

Я использую __init__ для построения вариантов выбора формы из параметров, переданных из представления. Похоже, что мои choices построены правильно, когда я делаю print(choices), но форма не загружает никаких вариантов. Даже виджет для него не отображается. Я не получаю никаких ошибок. Я использовал подобный код в других представлениях, которые работали, что является одной из причин, почему этот код действительно сбивает меня с толку.

Я увидел, что print("ok") никогда не выводится в shell, а print("else") выводится

view

def newobjtoassess(request, assess_pk):
    user = request.user
    assessment = Assessment.objects.get(pk=assess_pk)
    course_pk = assessment.course.pk
    context['assessment'] = assessment

    form = ObjToAssessmentForm(user=user, course_pk=course_pk)
    if request.method == 'POST':
        print("ok")
        form = ObjToAssessmentForm(request.POST, user=user, course_pk=course_pk)
        if form.is_valid():
            f = form.cleaned_data
            objective = f.get('objective')
            assessment.objectives.add(objective)
            assessment.save()
            return HttpResponseRedirect(reverse('gradebook:assessupdate', args=[assess_pk]))
        else:
            context['form'] = form
            return render(request, "gradebook/newobjtoassess.html", context)
    else:
        print("else")
        form = ObjToAssessmentForm(user=user, course_pk=course_pk)

    return render(request, "gradebook/newobjtoassess.html", context)

form

class ObjToAssessmentForm(forms.Form):
    objective = forms.ChoiceField(label='Learning Objective', choices=[])

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        my_course = kwargs.pop('course_pk')
        super(ObjToAssessmentForm, self).__init__(*args, **kwargs)
        choices=[(o.id, str(o)) for o in Objective.objects.filter(user=user, course=my_course)]
        print(choices)
        self.fields['objective'] = forms.ChoiceField(choices=choices)

шаблон

{% extends 'base-g.html' %} {% load static %} {% block content %}
{% load crispy_forms_tags %}
<div class="container">
    <div class="row">
        <div class="col">
          <p>Course:&nbsp;{{ assessment.course }}</p>
        </div>
      </div>
    <div class="row">
        <div class="col">
          <p>{{ assessment.assessment_name }}</p>
        </div>
    </div>
    <div class="row">
        <div class="col">
            <form method="post">{% csrf_token %}
                {{ form|crispy }}
                <input type = "submit" value="Update">
            </form>
        </div>
    </div>
</div>

{% endblock content %}

я перепутал отступы в else. Также мне нужно было передать форму в шаблон в else.

# the last (2nd of the two) else in the view above
else:
    form = ObjToAssessmentForm(user=user, course_pk=course_pk)
    context['form'] = form
    return render(request, "gradebook/newobjtoassess.html", context)

Вид можно немного почистить, но это решает проблему.

Вернуться на верх