2009-06-15 7 views
2

Ich habe eine Pylons-App und verwende FormEncode und HtmlFill, um mit meinen Formularen umzugehen. Ich habe ein Array von Textfeldern in meiner Vorlage (Mako)Pylons FormEncode mit einem Array von Formularelementen

 
    <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> 

Allerdings kann ich nicht scheinen, um herauszufinden, wie Sie diese Felder zu validieren. Hier ist der entsprechende Eintrag aus meinem Schema

yardage = formencode.ForEach(formencode.validators.Int())

Ich versuche, zu bestätigen, dass jedes dieser Felder ist ein Int. Für diese Felder wird jedoch keine Validierung durchgeführt.

UPDATE Wie hier angefordert ist der Code für die Aktion dieses Controllers. Ich weiß, dass es funktionierte, da ich andere Formularfelder 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') 

UPDATE Es wurde im IRC vorgeschlagen, dass ich den Namen der Elemente yardage[]-yardage Kein Ergebnis ändern. Sie sollten alle ints sein, aber das Einfügen von f in eines der Elemente führt nicht dazu, dass es ungültig ist. Wie ich bereits sagte, kann ich andere Formularfelder 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()) 
+0

Können Sie noch mehr Code teilen, nicht zuletzt den Controller-Code? – ayaz

Antwort

5

Stellt sich heraus, was ich tun wollte, war nicht ganz richtig.

Vorlage:

<tr> 
    <td>Yardage</td> 
    % for hole in range(9): 
    <td>${h.text('hole-%s.yardage'%(hole), maxlength=3, size=3)}</td> 
    % endfor 
</tr> 

(Sollte haben es in einer Schleife, die mit zu beginnen.) Sie werden bemerken, dass der Name des ersten Elements hole-1.yardage werden wird. Ich werde dann FormEncode.variabledecode verwenden, um dies in ein Wörterbuch umzuwandeln. 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()) 

Die HoleSchema wird bestätigen, dass hole-#.par und hole-#.yardage beide Ints sind und nicht leer. formencode.ForEach ermöglicht es mir, HoleSchema auf das Wörterbuch anzuwenden, das ich von variable_decode=True an den @validate Dekorateur erhalten. Hier

ist die submit Aktion von meinem

-Controller:

@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!' 

Mit dem @validate Dekorateur ermöglicht einen viel sauberen Weg zu validieren und in den Formen zu füllen. Die variable_decode=True ist sehr wichtig oder das Wörterbuch wird nicht ordnungsgemäß erstellt.

1
c.form_result = schema.to_python(request.params) - (without dict) 

Es scheint zu funktionieren.

Verwandte Themen