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 yardageKein 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())
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top