What is the correct way to manually raise a
deform.exception.ValidationFailure from a view, to set a particular field
as having an invalid value? I don't want to create a custom validator
because there are many situations where you want the application logic to
be in the view not in a form validation function.
I can set up the errors directly on the form itself, which gets the error
messages to render to the form html.
form.error = colander.Invalid(None, 'Error message on form')
form['some_field'].error = colander.Invalid(None, 'Error message on
field')
raise deform.exception.ValidationFailure(form, None, form.error)
But the problem is that I can't unit test this manually-thrown
ValidationFailure in the same way as the ones thrown by deform. In other
situations I can make assertions like the following
assert len(e.error.children) == 1
assert e.error.children[0].asdict()['some_field'] == 'Error message
on field'
But in the above case 'e.error.children' is an empty list. How do I raise
the ValidationFailure consistently with ones thrown by deform?
I can do it like the following, and everything gets set up identical to
when deform does it (including populating the 'pos' attribute on
colander.Invalid. However, now the errors aren't getting rendered to the
form html.
e = colander.Invalid(form.schema, 'Error message on form')
e['some_field'] = 'Error message on field'
raise deform.exception.ValidationFailure(form, None, e)
The only way I can get it to work is like the following, now the object
gets created correctly and it renders properly on the page. Here I am
assigning the Invalid errors to the schema then re-assigning them to the
correct place in the form. But this is not DRY and seems quite hack-ish.
(Especially the 4th line, were I can't retrieve the created child Invalid
by doing e.children['some_field'] but have to get it using the numerical
index.) This tells me I'm probably not raising this ValidationFailure
properly.
What is the correct way to be doing this in a DRY way?
e = colander.Invalid(form.schema, 'Error message on form')
e['some_field'] = 'Error message on field'
form.error = e
form['some_field'].error = e.children[0]
raise deform.exception.ValidationFailure(form, None, form.error)
--
You received this message because you are subscribed to the Google Groups
"pylons-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/pylons-discuss.
For more options, visit https://groups.google.com/d/optout.