Доброго времени суток. Чет я уже под конец рабочего дня уже подтормаживаю)
Есть модели, вопрос и ответ. Есть форма, которая работает с одним вопросом. Т.е. выводит тест с одним вопросом, и валидирует ответ юзера. Позволяет сделать мини тест.
Внимание вопрос:
Как мне формировать правильно набор форм, что бы я мог создавать набор форм из нескольких вопросов, и валидировать несколько? А точнее, как правильно это сделать?
models.py
class Question(models.Model):
question = models.TextField("Вопрос:")
date_created = models.DateTimeField("Дата создания вопроса",
auto_now_add=True)
active = models.BooleanField("Активен ли вопрос", default=True)
class Answers(models.Model):
question = models.ForeignKey(Question, verbose_name="Вопрос: ")
answer = models.CharField("Ответ:", max_length=250)
correctly = models.BooleanField("Правильный ответ", default=False)
forms.py
class QuestionLabelWidget(forms.Widget):
""" Widget for Question, input question to label """
def render(self, name, value, attrs=None):
""" return HTML label text question """
str_ = "<span>{}</span><input type='hidden' name='{}' value='{}' />".format(value, name, value)
return str_
class TestThreeQuestionForm(forms.Form):
""" Form for test app, view one question """
question = forms.CharField(
widget=QuestionLabelWidget()
)
answers = forms.ModelChoiceField(
queryset=Answers.objects.none(),
widget=forms.RadioSelect(),
empty_label=None,
)
def __init__(self, *args, **kwargs):
""" init queryset answers for Form """
super(TestThreeQuestionForm, self).__init__(*args, **kwargs)
if args and isinstance(args[0], dict) and args[0]:
ans = args[0]['answers']
if isinstance(ans, str):
self.fields['answers'].queryset = Answers.objects.filter(
question=Answers.objects.get(pk=int(ans)).question
)
self.answer_ = self.fields['answers'].queryset.get(pk=ans)
else:
self.fields['answers'].queryset = ans
def is_valid(self):
result = super(TestThreeQuestionForm, self).is_valid()
if not self.answer_.correctly:
result = False
self.add_error('answers', forms.ValidationError("Ответ неверный"))
return result
Я понимаю что надо наследовать BaseFormSet
в нем метод clean
.
Меня интересует как сделать с помощью моей формы, набор форм что бы создавать тесты, создавая просто набор форм с нужным кол-вом вопросов.
Как?
Есть свои наработки, но все печально там.
Вся сложность, в том, что при создании одного экземпляра моей формы, надо ей скармливать {"question": Queryset(Question), "answers": Queryset(answers for question)}
Updated 16 Sept. 2016, 15:26 by neoliz.