【发布时间】:2020-12-13 10:36:21
【问题描述】:
我有一个用于撰写和编辑这样的博客文章的表单:
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_required
def 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()
在与我的问题相关的other questions 周围钓鱼时,我发现我不能直接使用form.tags.data 突出显示关联的标签,因为这意味着该字段会忽略用户对表单的操作,即使选择正确将突出显示。这就是我使用form.tags.default 的原因。
form.tags.default 似乎可以突出显示正确的标签,但form.process() 会擦除由form = EditorForm(obj=post) 填写的所有其他字段。
所以我的问题是:如何使用现有的帖子数据填充我的表单并在同一实例中突出显示正确的标签?
【问题讨论】:
标签: python flask flask-wtforms wtforms