صيغ الصلب مع مجموعة من عناصر النموذج
-
13-09-2019 - |
سؤال
لدي تطبيق من الصعب وأست باستخدام FormEncode و HTMLFAMT لمعالجة النماذج الخاصة بي. لدي مجموعة من الحقول النصية في قالب بلدي (ماكو)
u003Ctr>u003Ctd>مقدار من اليارداتu003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003Ctd> $ {h.text ('yardage []'، maxlength = 3، حجم = 3)}u003C/td>u003C/tr>
ومع ذلك، لا يمكنني معرفة كيفية التحقق من صحة هذه الحقول. هنا هو الدخول ذات الصلة من مخططي
yardage = formencode.ForEach(formencode.validators.Int())
أحاول التحقق من صحة أن كل من هذه الحقول هو int. ومع ذلك، لا يحدث التحقق من الصحة لهذه الحقول.
تحديثكما هو مطلوب هنا هو رمز لعمل وحدة التحكم هذه. أعلم أنه كان يعمل كما يمكنني التحقق من صحة حقول النماذج الأخرى.
SEF إرسال (الذاتي): مخطط = TRYFFORM () TRY: C.Form_Result = Schema.to_Python (DICTS (REST.PARAMS)) باستثناء FormEcode.invalid، خطأ: C.Form_Result = Error.Value C.Form_errors = Error.error_dict أو {} C.HEADING = "إضافة دورة" HTML = تقديم ('/ مستحق / دورة / add.html') إرجاع HTMLFill.Render (HTML، الافتراضي = C.Form_Result، الأخطاء = c.form_errors) آخر: h.redirect_to (Controler = "بالطبع"، الإجراء = "عرض")
تحديثاقترح على IRC أنني أغير اسم العناصر من yardage[]
ل yardage
لا نتيجة. يجب أن يكونوا جميعا في اتحادهم لكنهم وضعوا في أحد العناصر لا يتسبب في أن يكونوا غير صالحين. كما قلت من قبل، أنا قادر على التحقق من صحة حقول النماذج الأخرى. أدناه هو مخططي بالكامل.
استيراد FormEcode Classform (FormEncode.Schema): ANDING_EXTRA_FIELSTER = TRUE FILDERA_EXTRA_FIELSTER = الاسم الحقيقي = formencode.vidators.notempty (الرسائل = {فارغة ":" يجب ألا يكون الاسم فارغا "}) par = formencode.foreach (formencode.validatorators. int ()) Yardage = formencode.forectach (formencode.validators.int ())
المحلول
اتضح ما أردت فعله لم يكن صحيحا تماما.
نموذج:
<tr>
<td>Yardage</td>
% for hole in range(9):
<td>${h.text('hole-%s.yardage'%(hole), maxlength=3, size=3)}</td>
% endfor
</tr>
(يجب أن يكون قد صنعته في حلقة لتبدأ.) ستلاحظ أن اسم العنصر الأول سيصبح hole-1.yardage
. وبعد سأستمر بعد ذلك formencode.variabledecode.
لتحويل هذا إلى قاموس. يتم ذلك في
مخطط:
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())
سوف holeschema التحقق من صحة ذلك hole-#.par
و hole-#.yardage
كلاهما ints وليست فارغة. formencode.ForEach
يسمح لي بالتطبيق HoleSchema
إلى القاموس الذي أحصل عليه من المرور variable_decode=True
إلى @validate
ديكور.
هنا هو submit
العمل من بلدي
مراقب:
@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!'
باستخدام @validate
تتيح Decorator طريقة أكثر نظافة للتحقق من صحة وملء النماذج. ال variable_decode=True
مهم جدا أو لن يتم إنشاء القاموس بشكل صحيح.
نصائح أخرى
c.form_result = schema.to_python(request.params) - (without dict)
يبدو أن يعمل بشكل جيد.