Pylons Formcode mit einem Array von Formelementen
-
13-09-2019 - |
Frage
Ich habe eine Pylons -App und verwende FormCodes und HTMLFill, um meine Formulare zu verarbeiten. Ich habe eine Reihe von Textfeldern in meiner Vorlage (Mako)
<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>
Ich kann jedoch nicht herausfinden, wie ich diese Felder validieren kann. Hier ist der entsprechende Eintrag von meinem Schema
yardage = formencode.ForEach(formencode.validators.Int())
Ich versuche zu bestätigen, dass jedes dieser Felder ein int ist. Für diese Felder erfolgt jedoch keine Validierung.
AKTUALISIERENWie hier angefordert ist der Code für die Aktion dieses Controllers. Ich weiß, dass es funktioniert hat, da ich andere Formulierungsfelder validieren kann.
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')
AKTUALISIERENEs wurde bei IRC vorgeschlagen, dass ich den Namen der Elemente ändere yardage[]
zu yardage
Kein Ergebnis. Sie sollten alle int sein, aber in eines der Elemente einteilen, lässt es nicht ungültig sind. Wie ich bereits sagte, kann ich andere Felder für Formular validieren. Unten ist mein gesamtes Schema.
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())
Lösung
Es stellte sich heraus, was ich tun wollte, war nicht ganz richtig.
Schablone:
<tr>
<td>Yardage</td>
% for hole in range(9):
<td>${h.text('hole-%s.yardage'%(hole), maxlength=3, size=3)}</td>
% endfor
</tr>
(Hätte es in einer Schleife schaffen sollen.) Sie werden feststellen, dass der Name des ersten Elements werden wird hole-1.yardage
. Ich werde dann verwenden FOMMECODE.VariableDeCode
Um dies in ein Wörterbuch zu verwandeln. Dies geschieht in der
Schema:
import formencode
class HoleSchema(formencode.Schema):
allow_extra_fields = False
yardage = formencode.validators.Int(not_empty=True)
par = formencode.validators.Int(not_empty=True)
class CourseForm(formencode.Schema):
allow_extra_fields = True
filter_extra_fields = True
name = formencode.validators.NotEmpty(messages={'empty': 'Name must not be empty'})
hole = formencode.ForEach(HoleSchema())
Das Löschema wird das bestätigen hole-#.par
und hole-#.yardage
sind beide int und sind nicht leer. formencode.ForEach
erlaubt mir zu bewerben HoleSchema
zu dem Wörterbuch, das ich vom Passieren bekomme variable_decode=True
zum @validate
Dekorateur.
Hier ist der submit
Aktion von mir
Regler:
@validate(schema=CourseForm(), form='add', post_only=False, on_get=True,
auto_error_formatter=custom_formatter,
variable_decode=True)
def submit(self):
# Do whatever here.
return 'Submitted!'
Verwendung der @validate
Dekorateur ermöglicht eine viel sauberere Möglichkeit, die Formulare zu validieren und auszufüllen. Das variable_decode=True
ist sehr wichtig oder das Wörterbuch wird nicht ordnungsgemäß erstellt.
Andere Tipps
c.form_result = schema.to_python(request.params) - (without dict)
Es scheint gut zu funktionieren.