การสร้างแบบฟอร์มจำนวน N โดยใช้ WTForms

ฉันเพิ่งเริ่มใช้ขวดและ WTForms ขออภัยล่วงหน้า

อย่างไรก็ตาม ฉันกำลังพยายามสร้างหลายรูปแบบโดยใช้แบบฟอร์มเดียวกันที่กำหนดไว้ด้านล่างใน forms.py

File_Choices = [('1', 'ex1.pdf'), ('2', 'ex2.pdf')
class Inputs(Form):
    Files = SelectField(u'File', choices=File_Choices,validators =[Required()])

ฉันคุ้นเคยกับความจริงที่ว่าฉันต้องประกาศบางอย่างในบรรทัด: form1=Inputs() เพื่อประกาศแบบฟอร์มใน views.py อย่างไรก็ตาม ปัญหาเกิดขึ้นเมื่อฉันต้องประกาศแบบฟอร์มในจำนวนที่ไม่รู้จักและติดตามค่าที่เลือก

ปัญหาเฉพาะของฉันคือฉันมีรายการที่มีองค์ประกอบ N และแต่ละองค์ประกอบต้องสอดคล้องกับไฟล์ที่ผู้ใช้เลือกจากแบบฟอร์ม ดังนั้นฉันจึงแจกแจงปัญหาของฉันโดยสร้างแบบฟอร์มจำนวน N ก่อนและคิดถึงการใช้ for loop เช่นนี้:

for i in range(len(PDF_list))
    form'i'=Input()

ดังนั้นผลคูณสุดท้ายหากความยาวของรายการคือ 5 คือ 5 แบบฟอร์มอินพุตประกาศเป็น form1, form2, form3, form4, form5 ฉันรู้ว่านี่ใช้ไม่ได้ผลเหมือนที่ฉันเพิ่งเขียนโค้ด แต่นั่นคือฟังก์ชันที่ฉันพยายามได้รับ ดังนั้นฉันจึงยังสามารถเข้าถึงค่าที่ส่งมาโดยใช้บางอย่างเช่น

dict(File_Choices).get(form'i'.Files.data).

อาจมีวิธีที่ชัดเจนในการทำเช่นนี้ ฉันยังใหม่กับการใช้ flask และ WTForms ดังนั้นความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมและในโซลูชันของคุณหากคุณสามารถอธิบายทีละขั้นตอนสิ่งที่คุณกำลังทำตั้งแต่ฉันใหม่ นั่นจะเป็น สุดยอด.


person Jaquacky    schedule 27.05.2015    source แหล่งที่มา


คำตอบ (1)


ฉันเชื่อว่าสิ่งที่คุณต้องการคือ FieldList.

ดังนั้นคุณจะมีบางอย่างเช่น:

from wtforms.fields import FieldList

file_choices = [('1', 'ex1.pdf'), ('2', 'ex2.pdf')
class Inputs(Form):
    files = FieldList(
        SelectField(u'File', choices=file_choices, validators =[Required()]),
        min_entries = N
    )

min_entries ระบุจำนวน "SelectFields" ที่ควรปรากฏบนแบบฟอร์ม วิธีนี้จะทำให้คุณมีแบบฟอร์มเดียวที่มีช่องเลือกแบบเลื่อนลงหลายช่อง โดยแต่ละช่องมีรายการ file_choices เหมือนกัน

ในไฟล์เทมเพลตของคุณ คุณสามารถส่งออกฟิลด์ที่เลือกทั้งหมดเช่นนี้ (ซึ่งจะแสดงฟิลด์ที่เลือก N ทั้งหมด:

<html>
    <form action="" method=post>
        {{ form.files }}
        <input type="submit" />
    </form>
</html>

คุณยังสามารถวนซ้ำ form.files และจัดรูปแบบ SelectField ทีละรายการได้

ตอนนี้เมื่อแบบฟอร์มของคุณถูกโพสต์ คุณสามารถเข้าถึง SelectField แต่ละอันได้โดยการวนซ้ำมากกว่า form.files ดังนี้:

for select_field in form.files:
    print(select_field.data)

คุณยังสามารถเข้าถึง SelectField โดยใช้ดัชนีได้ ในการเข้าถึง SelectField ที่สาม:

form.files[2].data

จะส่งกลับ '1' หรือ '2' ขึ้นอยู่กับไฟล์ที่ผู้ใช้เลือกใน SelectField นั้น

person junnytony    schedule 27.05.2015
comment
ฉันเห็นว่านั่นคือฟังก์ชันที่ฉันกำลังมองหา แต่ฉันยังคงสับสนเล็กน้อยเกี่ยวกับวิธีการเข้าถึงฟิลด์ที่เลือกจากผู้ใช้ ฉันได้ลองดูเอกสารประกอบแล้ว แต่ดูเหมือนจะไม่พบอะไรเลย - person Jaquacky; 28.05.2015
comment
ดูการอัปเดตคำตอบของฉัน FieldLists เป็นรายการของ Fields เป็นหลัก ดังนั้นคุณจึงสามารถเข้าถึงช่องที่เก็บไว้ได้เหมือนกับรายการ Python อื่นๆ ได้แก่ การจัดทำดัชนีโดยตรง ตัววนซ้ำ ความยาว ในกรณีนี้แต่ละรายการในรายการจะเป็น SelectField - person junnytony; 28.05.2015
comment
ใช่ ขอบคุณ นี่คือสิ่งที่ฉันกำลังมองหา! - person Jaquacky; 28.05.2015