簡體   English   中英

如何將flask_sqlalchemy orm中的數據添加到WTForm FieldList?

[英]How to add data from flask_sqlalchemy orm to WTForm FieldList?

我想使用flask、WTForm 和flask_sqlalchemy 建立一個網站。 有一個網頁供用戶通過WTForm提交信息,現在我想創建另一個頁面來顯示數據庫中的所有數據。我想使用WTForm來做到這一點。在一本書中,示例如下:

def GetSchoolFormById(school_id):
    school = orm.School.query.get(int(school_id))
    if school is None:
        return None
    schoolform = SchoolForm()
    schoolform.id.data = school.id
    schoolform.name.data = school.name
    schoolform.area_id.data = school.area_id
    schoolform.area_name = school.area.name
    schoolform.teachdesc.data = school.teachdesc
    schoolform.address.data = school.address
    schoolform.schooltype_id.data = school.schooltype_id
    schoolform.schooltype_name = school.schooltype.name
    schoolform.website.data = school.website
    schoolform.distinguish.data = school.distinguish
    schoolform.leisure.data = school.leisure
    schoolform.threashold.data = school.threashold
    schoolform.partner.data = school.partner
    schoolform.artsource.data = school.artsource
    schoolform.feedesc.data = school.feedesc
    schoolform.longitude.data = school.longitude
    schoolform.latitude.data = school.latitude
    schoolform.schoolimages = school.schoolimages
    schoolform.feature_ids.data = [x.feature_id for x in school.schoolfeatures]

    schoolform.area_id.choices = g_choices_area
    schoolform.schooltype_id.choices = g_choices_schooltype
    schoolform.feature_ids.choices = g_choices_feature
    return schoolform

但是對於我來說,我使用了FieldList,所以我不知道如何像示例那樣添加數據。

class ProjectForm(FlaskForm):
    project_id = HiddenField('項目ID')
    project_name = StringField('工程名稱')
    project_ST = DateField('起始時間', format='%Y-%m-%d')
    project_FT = DateField('截止時間', format='%Y-%m-%d')


class ItemsForm(Form):
    item_id = HiddenField('事件ID')
    item_name = StringField('事件名稱')
    pre_item = SelectMultipleField('前驅事件')
    # 暫定為string類型,加到date的%d里,具體我也不會,實現不了可以再改
    last_time = StringField('持續時間')


class MainForm(FlaskForm):
    items = FieldList(
        FormField(ItemsForm)
    )
@app.route('/view_items', methods=['GET', 'POST'])
def view_items():
    form_one = ProjectForm()
    form_two = MainForm()
    if request.method == 'GET':
        project = DBProject.query.filter_by(project_id=1).first().__dict__
        print(project)
        # 由於目前只有一個project,所以直接導入全部items數據
        items = list(DBItem.query.filter().all())

        form_one.project_id.data = project['project_id']
        form_one.project_name.data = project['project_name']
        form_one.project_ST.data = project['project_ST']
        form_one.project_FT.data = project['project_FT']

        for item in items:
            print(item)
            form_two.items.append_entry(ItemsForm(item))
    return render_template('view_items.html', form_one=form_one, form_two=form_two)

當我測試我的代碼時,從底部開始的第二行有一個錯誤,如下所示:

TypeError: formdata should be a multidict-type wrapper that supports the 'getlist' method

我該如何處理?我應該使用其他方法將數據傳遞到html頁面而不是WTForm嗎?

WTForms 表單的 __init__ 方法的參數如下__init__(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs) 您正在傳遞一個 Sqlalchemy 對象作為 formdata 參數,該參數旨在接收通過 http 帖子作為 Werkzeug Multidict 發送的用戶表單數據。 如果您將對象作為 obj 參數傳遞,那么只要數據庫列名稱與表單字段名稱匹配,它就應該可以工作。 您還可以使用此技術來初始化您的 ProjectForm,而不是依次為每個字段設置數據。

project = DBProject.query.filter_by(project_id=1).first()
form_one = ProjectForm(obj=project)

items = list(DBItem.query.filter().all())
for item in items:
    form_two.items.append_entry(ItemsForm(obj=item))

暫無
暫無

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

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