亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Flask-WTF 中填充表單和選擇默認值

在 Flask-WTF 中填充表單和選擇默認值

qq_遁去的一_1 2023-06-20 13:34:23
我有一個用于撰寫和編輯博客文章的表單,如下所示:class EditorForm(FlaskForm):    title = StringField('Title', validators=[DataRequired(), Length(min=1, max=250)])    body = PageDownField('Body', validators=[DataRequired()])    tags = SelectMultipleField('Tags', coerce=int)    timestamp = DateTimeField('Timestamp')    published = BooleanField('Publish?')    update = BooleanField('Update Timestamp?')    delete = SubmitField('Delete')    submit = SubmitField('Save')在我看來,我區分編輯現有帖子和創建新帖子。對于現有的帖子,如果它們有關聯的標簽,我希望它們在表單中突出顯示,SelectMultipleField以便用戶可以看到它們。如果這些被突出顯示并且我想刪除標簽,我需要能夠取消突出顯示它們并提交表單來這樣做。以下是我目前觀點的相關部分:@app.route('/editor/<slug>', methods=['GET', 'POST'])@app.route('/editor/', methods=['GET', 'POST'])@login_requireddef editor(slug=None):    # old post or new post?    if slug:        post = Post.query.filter_by(slug=slug).first()    else:        post = Post()    # populate form, blank for new post    form = EditorForm(obj=post)        # populate tags field    form.tags.choices = [(tag.id, tag.tag) for tag in Tag.query.order_by('tag')]    # declare list for tag highlights on GET    if request.method == 'GET':        form.tags.default = []    # if post has linked tags, highlight them    if post.tags:        for tag in post.tags:            if tag.id not in form.tags.default:                form.tags.default.append(tag.id)        form.process()在解決與我的問題相關的其他問題時,我發現我不能直接使用form.tags.data來突出顯示關聯的標簽,因為這意味著該字段將忽略用戶在表單上的操作,即使正確的選擇將被突出顯示。這就是我使用form.tags.default.form.tags.default似乎可以突出顯示正確的標簽,但form.process()會擦除由填寫的所有其他字段form = EditorForm(obj=post)。所以我的問題是:如何使用現有的帖子數據填充我的表單并在同一實例中突出顯示正確的標簽?
查看完整描述

1 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

我似乎已經通過這個問題獲得了我想要的結果。我原來的問題的一部分實際上與我沒有在我的問題中發布的視圖中的一些代碼有關。


在 上,我將(突出顯示的選項)if form.validate_on_submit():中的標簽附加到我的. 在帖子已經附加標簽的情況下,這意味著取消選擇字段中的默認值確實會根據需要清空,但無論如何仍然有原始數據,因此沒有變化。form.tags.datapost.tagsform.tags.datapost.tags


這是通過以下方式解決的:


# empty tags list then add highlighted choices

    post.tags = []

    for id in form.tags.data:

        t = Tag.query.filter_by(id=id).first()

        post.tags.append(t)

我還更改了填充表單的代碼,使其更簡單。我錯了需要使用defaultover data(坦率地說,我不明白兩者之間的區別):


    # populate form, blank for new post

    form = EditorForm(obj=post)

    # populate tags field

    form.tags.choices = [(tag.id, tag.tag) for tag in Tag.query.order_by('tag')]

    # populate defaults only on GET otherwise user choice overidden

    if request.method == 'GET':

        # declare default (highlighted) tags list

        form.tags.data = []

        # if post has tags, highlight them

        if post.tags:

            for tag in post.tags:

                form.tags.data.append(tag.id)


查看完整回答
反對 回復 2023-06-20
  • 1 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號