簡體   English   中英

WTForms/Flask:動態 min_entries

[英]WTForms/Flask: Dynamic min_entries

我希望動態地使用 min_entries WTForms 參數,即沒有硬編碼數字。

它在 form.py 中看起來像這樣:

class TestSpecForm(FlaskForm): 
    student_number = IntegerField('Number of Students')


class StudentForm(FlaskForm):
    answer = StringField('')


class TestInputForm(FlaskForm):
    students = FieldList(FormField(StudentForm))  # I'd like to insert the dynamic min_entries here
    submit = SubmitField('Submit')

在views.py中是這樣的:

def input(key_id):
    key = Testspecs.query.get_or_404(key_id) 
    student_number = key.student_number
    form = TestInputForm()
    form.students.min_entries = student_number
    if form.validate_on_submit():
        ...

但是,這不起作用並且只是為 TestInputForm 呈現 NO FIELDS。 如果我將“min_entries = 10”放入TestInputForm 的students 變量中,一切都會按預期進行。 但我無法動態完成它。

有人可以幫我嗎? 根據我所有的 google/reddit/SO 搜索,這基本上是 WTForms 中大多數參數或驗證器的動態設置方式。

謝謝

我剛剛發現了字段列表和表單字段,並在互聯網上搜索了文檔或示例,但幾乎沒有幫助。 我想出了在您渲染模板時獲取動態條目數量的好方法,所以我想我會在這里提交,以防它對任何人有幫助。 請注意,這並不能解決使用按鈕或類似方法即時添加條目的問題。

def input(key_id):
    key = Testspecs.query.get_or_404(key_id) 
    student_number = key.student_number
    form = TestInputForm()
    # if the form was submitted, then it will collect all the entries for us
    if form.validate_on_submit():
        # form has whatever entries were just submitted
        for entry in form.students.entries:
            ...
        return(redirect(...))
    # if we get here, either validation failed or we're just loading the page
    # we can use append_entry to add up to the total number we want, if necessary
    for i in range(len(form.students.entries), student_number):
        form.students.append_entry()
    return render_template("input.html", form=form)

動態覆蓋min_entries上的FieldList是不可能的。

解決方法是對表單進行子類化並使用所需的值綁定一個新的FieldList

所以你的代碼必須看起來像這樣:

def input(key_id):
    key = Testspecs.query.get_or_404(key_id) 
    student_number = key.student_number
    # Subclass form and bind new field
    class LocalForm(TestInputForm):pass
    LocalForm.students = FieldList(FormField(StudentForm), min_entries=student_number)
    # Use our new form
    form = LocalForm()
    if form.validate_on_submit():
        ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM