Делаю приложение "Тесты". В общем имеются такие модели:
class Test(models.Model):
test_name = models.CharField(max_length=400, unique=True)
slug = AutoSlugField(populate_from='test_name', always_update=True, unique=True)
def __unicode__(self): # __unicode__ on Python 2
return self.test_name
class Question(models.Model):
question_name = models.CharField(max_length=400, verbose_name = 'Вопрос', unique=True)
test = models.ForeignKey(Test, verbose_name="Имя теста")
def __unicode__(self): # __unicode__ on Python 2
return self.question_name
class Answer(models.Model):
ANSWER_CHOICES = (
('1', 'Правильный ответ'),
('0', 'Неправильный ответ'),
)
name_answer = models.CharField(max_length=400, verbose_name = 'Вариант ответа')
correctness = models.CharField(max_length=1, choices=ANSWER_CHOICES, default=0, verbose_name = '')
question = models.ForeignKey(Question, verbose_name="Вопрос")
def __unicode__(self): # __unicode__ on Python 2
return self.name_answer
В общем бд заполнил. Теперь нужно вывести с одного теста все вопросы используя wizard form
Тоесть один вопрос и варианты ответов на одном шаге, на втором шаге уже другой вопрос со своими вариантами ответов итд.
В общем как мне кажется, получился у меня полный костыль и пока до конца не работает
Код view для Wizard form
def get_form_list(request, form_list=None):
# ПОЛУЧАЕМ ВСЕ ВОПРОСЫ ИЗ ВЫБРАННОГО ТЕСТА
questions = Question.objects.filter(test_id = 1).values()
myModelFormset1 = modelformset_factory(Answer, form=AnswerForm_wizard, extra=0)
# ПЕРЕБИРАЕМ ВСЕ ВОПРОС ИЗ ТЕСТА
i = 0
inst_dict = {}
for question in questions:
inst_dict[str(i)] = Answer.objects.filter(question_id = question['id'])
i = i + 1
# Делаем форму для каждого вопроса
if form_list is None:
form_list = list()
for question in questions:
form_list.append(myModelFormset1)
return ContactWizard.as_view(form_list=form_list, instance_dict=inst_dict)(request)
class ContactWizard(SessionWizardView):
def done(self, form_list, **kwargs):
return render_to_response('done.html', {
'form_data': [form.cleaned_data for form in form_list],
})
Template такой:
{% load i18n %}
{% block head %}
{{ wizard.form.media }}
{% endblock %}
{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{{ wizard.form.forms.0.question }}
{% for form in wizard.form.forms %}
<br>
{{ form.id }}
<input id="{{form.name_answer.id_for_label }}" type="radio" value="{{ form.name_answer.value }}" name="arr[{{form.name_answer.html_name }}]">
<input id="{{form.name_answer.id_for_label }}" type="hidden" value="{{ form.name_answer.value }}" name="{{form.name_answer.html_name }}">
{{ form.name_answer.value }}
{% endfor %}
{% else %}
{{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "Первый вопрос" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "Предыдущий вопрос" %}</button>
{% endif %}
<input type="submit" value="{% trans "Дальше" %}"/>
</form>
{% endblock %}
Тоесть проблема такая. В шаблоне вопросы выводятся в input type="text", потому что в модели стоит тип CharField и для того, чтобы сделать radiobutton я сделал такой костыль:
<input id="{{form.name_answer.id_for_label }}" type="radio" value="{{ form.name_answer.value }}" name="arr[{{form.name_answer.html_name }}]">
<input id="{{form.name_answer.id_for_label }}" type="hidden" value="{{ form.name_answer.value }}" name="{{form.name_answer.html_name }}">
Если оставить только :
<input id="{{form.name_answer.id_for_label }}" type="radio" value="{{ form.name_answer.value }}" name="arr[{{form.name_answer.html_name }}]">
То в первом шаге вопросы будут выводиться, а вот во втором уже будут None показываться, поэтому сделал два input.
Теперь у меня не получается сделать это:
В конце всех шагов, мне надо получить все выбранные значения нажатых пользователем кнопок, как это сделать пока не понимаю, знаете как?
Как мне кажется у меня получился полный костыль и меня уже подташнивает от этого приложения, может как то можно сделать проще?
P.S. Надеюсь у вас хватит терпение прочиатть мое сообщение. :)