سؤال

لدي تطبيق من الصعب وأست باستخدام 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)

يبدو أن يعمل بشكل جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top