Деформировать - Как правильно отображать ошибки элемента виджета последовательности?

У меня возникают проблемы с отображением ошибок в элементах виджета последовательности с помощью проверки на уровне формы. При возникновении ошибки он помечает все поля в этом конкретном элементе последовательности красным, а также все остальные элементы последовательности, даже если этот элемент последовательности заполнен правильно (даже недавно добавленные элементы последовательности). Есть ли способ отметить только определенные поля, которые являются неправильными, как красный? 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(),
    )

0 ответов

Другие вопросы по тегам