J'ai une application Pylons et j'utilise FormEncode et HtmlFill pour gérer mes formulaires. J'ai un tableau de champs de texte dans mon modèle (Mako)Pylônes FormEncode avec un tableau d'éléments de formulaire
<tr> <td>Yardage</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> </tr>
Cependant, je ne peux pas à comprendre comment valider ces champs. Voici l'entrée correspondante de mon schéma
yardage = formencode.ForEach(formencode.validators.Int())
Je suis en train de vérifier que chacun de ces champs est un Int. Toutefois, aucune validation ne se produit pour ces champs.
MISE À JOUR Comme demandé ici est le code pour l'action de ce contrôleur. Je sais que cela fonctionnait comme je peux valider d'autres champs de formulaire.
def submit(self): schema = CourseForm() try: c.form_result = schema.to_python(dict(request.params)) except formencode.Invalid, error: c.form_result = error.value c.form_errors = error.error_dict or {} c.heading = 'Add a course' html = render('/derived/course/add.html') return htmlfill.render( html, defaults = c.form_result, errors = c.form_errors ) else: h.redirect_to(controler='course', action='view')
MISE À JOUR Il a été suggéré sur IRC que je change le nom des éléments yardage[]
-yardage
Aucun résultat. Ils devraient tous être ints mais mettre dans un des éléments ne le rend pas invalide. Comme je l'ai déjà dit, je suis capable de valider d'autres champs de formulaire. Voici mon schéma complet.
import formencode class CourseForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True name = formencode.validators.NotEmpty(messages={'empty': 'Name must not be empty'}) par = formencode.ForEach(formencode.validators.Int()) yardage = formencode.ForEach(formencode.validators.Int())
Pourriez-vous partager un peu plus de code, pas moins le code du contrôleur? – ayaz