Объект Queryset в форме Django не повторяется - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь получить форму для создания полей в зависимости от того, на какой странице экзамена находится пользователь. На странице ошибок все локальные переменные имеют правильное значение для формы и представления, но я продолжаю получать объект ExamQuestion не повторяемый и ошибку в строке 0 шаблона. Он также выделяет render () в строке 44 в представлении как источник проблемы. Если я изменю строку 28 с exam__name=exam_name на exam__name="exam_name", по сути, превращая переменную в str, страница запускается, но данные не передаются.

В консоли ошибок choice_list показывает querysets как отдельные элементы спискакак это должно быть для forms.py

Как сделать объект ExamQuestion итеративным? Я был в тупике уже неделю. К этому моменту я написал сто способов.

Я знаю, что в нем перечислены вопросы вместо ответов на вопросы, я просто пытаюсь заставить его загрузить ЛЮБОЙ queryset и в этот момент ошеломляюще бегать.

просмотр

def exampage(request, exam_name):

    exams = Exam.objects.all()
    questionlist = ExamQuestion.objects.filter(exam__name=exam_name)
    choicelist = ExamChoice.objects.filter(question__exam__name=exam_name)


    form = ExamTest(request.POST, exam_name=exam_name)
    if request.method == "POST":
        if form.is_valid():
            #form.save()
            #choice = form.cleaned_data.get('choice')
            return redirect('exampage.html')
            return render(request, 'exams/exampage.html', {'exams': exams,'questionlist': questionlist, 'exam_name': exam_name, 'choicelist': choicelist, 'form': form, 'choice': choice})

    else:
        form = ExamTest(exam_name=exam_name)

    return render(request, 'exams/exampage.html', {'exams': exams,'questionlist': questionlist, 'exam_name': exam_name, 'choicelist': choicelist, 'form': form})

форма

class ExamTest(forms.Form):
    def __init__(self, *args, **kwargs):
        exam_name = kwargs.pop('exam_name')

        super(ExamTest, self).__init__(*args, **kwargs)
        #choice_list = [x for x in ExamQuestion.objects.filter(exam__name="dcjs01")]
        #choice_list = []
        x = ExamQuestion.objects.filter(exam__name=exam_name)
        #for q in x:
        #    choice_list.append(q)
        self.fields["choices"] = forms.ChoiceField(choices=x,  label="testlabel")

шаблон


{% extends 'portal/base.html' %}

{% block content %}

<h1>{{ exam_name }} Page</h1>
{{ exam_id }}
<hr>

{% for exam in exams %}
<li><a href="/exams/{{ exam.name }}/">{{ exam }}</a></li>
{% endfor %}

<h1>! {{ questionlist }} !</h1>


    <form method="post" action="#">
      {% csrf_token %}
        formtest{{ form }}
    <button type="submit"> finish test </button>
    </form>




{% endblock %}

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

разобрался. выбор = х должен быть кортеж

self.fields['name'] = forms.ChoiceField(choices=tuple([(name, name) for name in x]))
0 голосов
/ 26 октября 2019

Первая часть вопроса - вы получаете ошибку ExamQuestion, не повторяемую:

  • здесь я думаю, что проблема в том, что вы, в форме init функция передает Queryset (objects.filter (xxx)), но не .all (), которая его выберет.

  • вторая мысль - было бы лучшепередать вопросы в качестве параметра в форму, поскольку вы ранее выбрали все вопросы для этого конкретного экзамена?

...