Деформировать - Как правильно отображать ошибки элемента виджета последовательности?
У меня возникают проблемы с отображением ошибок в элементах виджета последовательности с помощью проверки на уровне формы. При возникновении ошибки он помечает все поля в этом конкретном элементе последовательности красным, а также все остальные элементы последовательности, даже если этот элемент последовательности заполнен правильно (даже недавно добавленные элементы последовательности). Есть ли способ отметить только определенные поля, которые являются неправильными, как красный? MathQuestion.validation - это то место, где возникает исключение.
class MathQuestion(colander.Schema):
@classmethod
def both_unit_fields_or_neither(cls, form, value):
u = value['units']
u_g = value['units_given']
return not(u == u_g == None or u != None != u_g)
@classmethod
def accuracy_degree_must_be_specified_if_not_exact(cls, form, value):
accuracy = value['accuracy']
accuracy_degree = value['accuracy_degree']
print(accuracy)
return not ((accuracy_degree and accuracy and accuracy != models.Accuracy.exact) \
or (accuracy == models.Accuracy.exact and not accuracy_degree))
@classmethod
def validation(cls, form, value):
unit_fields_error = cls.both_unit_fields_or_neither(form, value)
accuracy_degree_error = cls.accuracy_degree_must_be_specified_if_not_exact(form, value)
error = False
exc = colander.Invalid(form, 'Some necessary fields are mising')
if unit_fields_error:
error = True
exc['units_given'] = 'Required if units are defined'
if accuracy_degree_error:
error = True
exc['accuracy_degree'] = 'Required if accuracy is other than exact'
if error:
raise exc
description = colander.SchemaNode(
colander.String(),
name = models.MathQuestion.description.name,
widget = deform.widget.RichTextWidget(delayed_load=True),
description = 'Enter the question description',
)
correct_answer = colander.SchemaNode(
colander.Float(),
name = models.MathQuestion.correct_answer.name,
widget = deform.widget.TextInputWidget(),
title = 'Enter the correct answer',
)
units = colander.SchemaNode(
colander.String(),
name = models.MathQuestion.units.name,
widget = deform.widget.TextInputWidget(css_class='units-input'),
description = '(Optional) Enter the units the answer must be in.',
missing = None,
)
units_given = colander.SchemaNode(
colander.Boolean(true_choices=TRUE_CHOICES, false_choices=FALSE_CHOICES, false_val=0, true_val=1),
name = models.MathQuestion.units_given.name,
description = 'Are the units given to the student?',
widget = deform.widget.RadioChoiceWidget(css_class='units-given-radio', values=((1, 'Yes'),(0, 'No')), inline=True),
missing = None,
)
accuracy = colander.SchemaNode(
MathAccuracy(),
name = models.MathQuestion.accuracy.name,
description = 'How accurate should the answer be?',
widget = deform.widget.SelectWidget(
css_class = 'math-accuracy-selector',
values = [('', '--Select--')] + [(val.name, val.name.replace('_',' ').title()) for val in models.Accuracy]
),
)
accuracy_degree = colander.SchemaNode(
colander.Float(),
name = models.MathQuestion.accuracy_degree.name,
description = 'The degree of accuracy.',
widget = deform.widget.TextInputWidget(css_class='math-accuracy-degree'),
missing = None,
)
class MathQuestions(colander.SequenceSchema):
math_question = MathQuestion(validator=MathQuestion.validation)
class MathQuestionSchema(CSRFSchema):
math_questions = MathQuestions(
name = models.MathQuestion.__table__.name,
widget = deform.widget.SequenceWidget(orderable=True),
)
question_type = colander.SchemaNode(
colander.String(),
name = models.Question.type.name,
default = models.QuestionType.math.name,
validator = colander.OneOf([models.QuestionType.math.name]),
widget = deform.widget.HiddenWidget(),
)