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

avatar
Doug Smith
9 августа 2021 в 06:24
34
1
0

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

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

просмотр

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)

форма

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 %}
Источник
shourav
9 августа 2021 в 06:38
1

можешь попробовать просто изменить варианты... self.fields['objective'].choices = choices

Doug Smith
9 августа 2021 в 13:18
0

shourav - я пробовал это, но это не изменило результат.

Ответы (1)

avatar
Doug Smith
13 августа 2021 в 17:05
0

Я перепутал отступ на 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)

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