flask - Flask wtforms Date and Time,选择器可用于新条目,但不能用于更新,尽管模板相同
问题描述
我可以为成功保存的新帖子条目创建日期和时间条目。但是,当我想更新和进行更改时,日期和时间输入小部件不可用。我不明白为什么。new 和 update 路由使用相同的 crete_post.html 模板。我在下面包含了这个模板、routes.py 和 forms.py。
create_post.html
...
<div class="form-group">
<h5> Date and Time</h5>
{% if form.date_posted.errors %}
{{ form.date_posted(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.date_posted.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.date_posted }}
{% endif %}
{% if form.time_posted.errors %}
{{ form.time_posted(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.time_posted.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.time_posted }}
{% endif %}
</div>
...
路线.py
...
@app.route("/post/new", methods=['GET', 'POST'])
def new_post():
form = PostForm()
if form.validate_on_submit():
post = Post(title=form.title.data,
description=form.description.data,
status=form.status.data,
priority=form.priority.data,
date_posted=form.date_posted.data,
time_posted=form.time_posted.data,
assigned_to=form.assigned_to.data,
reported_by=form.reported_by.data)
db.session.add(post)
db.session.commit()
flash('Your post has been created!', 'success')
return redirect(url_for('home'))
return render_template('create_post.html', title='New Post', form=form,
legend='New Post')
@app.route("/post/<int:post_id>")
def post(post_id):
post = Post.query.get_or_404(post_id)
return render_template('post.html', title=post.title, post=post)
@app.route("/post/<int:post_id>/update", methods=['GET', 'POST'])
# @login_required
def update_post(post_id):
post = Post.query.get_or_404(post_id)
form = PostForm()
if form.validate_on_submit():
post.title = form.title.data
post.description = form.description.data
post.date_posted=form.date_posted.data,
post.time_posted=form.time_posted.data,
post.status = form.status.data
post.priority = form.priority.data
post.assigned_to = form.assigned_to.data
post.reported_by = form.reported_by.data
db.session.commit()
flash('Your post has been updated!', 'success')
return redirect(url_for('home', post_id=post.id))
elif request.method == 'GET':
form.title.data = post.title
form.description.data = post.description
form.date_posted = post.date_posted
form.time_posted = post.time_posted
form.status.data = post.status
form.priority.data = post.priority
form.assigned_to.data = post.assigned_to
form.reported_by.data = post.reported_by
return render_template('create_post.html', title='Update Post',
form=form, legend ='Update Post')
表格.py
status_options = [('ongoing', 'ongoing'), ('completed', 'completed')]
priority_options = [('moderate', 'moderate'),('high', 'high'),('low','low')]
class PostForm(FlaskForm):
title = StringField('Title', validators=[DataRequired()])
description = TextAreaField('Description')
date_posted = DateField('Date')
time_posted = TimeField('Time')
status = SelectField('Status',choices = status_options)
priority = SelectField('Priority',choices = priority_options)
assigned_to = StringField('Assigned To')
reported_by = StringField('Reported By')
submit = SubmitField('Save')
目前:
模型.py
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
# date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
# time_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
date_posted = db.Column(db.Date, nullable=False, default=datetime.utcnow)
time_posted = db.Column(db.Time, nullable=False, default=datetime.utcnow)
description = db.Column(db.Text, nullable=False)
status = db.Column(db.String(100), nullable=False)
priority = db.Column(db.String(100), nullable=False)
assigned_to = db.Column(db.String(100), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
reported_by = db.Column(db.String(100), nullable=False)
表格.py
status_options = [('ongoing', 'ongoing'), ('completed', 'completed')]
priority_options = [('moderate', 'moderate'),('high', 'high'),('low','low')]
class PostForm(FlaskForm):
title = StringField('Title', validators=[DataRequired()])
description = TextAreaField('Description')
date_posted = DateField('Date',format='%Y-%m-%d')
time_posted = TimeField('Time',format='%H-%M')
#time_posted = TimeField('Time',format='%H:%M:%S')
#time_posted = TimeField('Time',format='%H:%M')
#time_posted = TimeField('Time',format='%h:%m:%s')
status = SelectField('Status',choices = status_options)
priority = SelectField('Priority',choices = priority_options)
assigned_to = StringField('Assigned To')
reported_by = StringField('Reported By')
submit = SubmitField('Save')
路线.py
@app.route("/post/<int:post_id>/update", methods=['GET', 'POST'])
# @login_required
def update_post(post_id):
post = Post.query.get_or_404(post_id)
# if post.author != current_user:
# abort(403)
form = PostForm()
if form.validate_on_submit():
post.title = form.title.data
post.description = form.description.data
post.date_posted=form.date_posted.data,
post.time_posted=form.time_posted.data,
post.status = form.status.data
post.priority = form.priority.data
post.assigned_to = form.assigned_to.data
post.reported_by = form.reported_by.data
db.session.commit()
flash('Your post has been updated!', 'success')
return redirect(url_for('home', post_id=post.id))
elif request.method == 'GET':
form.title.data = post.title
form.description.data = post.description
form.date_posted.data = post.date_posted
#form.time_posted.data = post.time_posted
form.time_posted.data = (datetime.datetime.min + post.time_posted).time()
form.status.data = post.status
form.priority.data = post.priority
form.assigned_to.data = post.assigned_to
form.reported_by.data = post.reported_by
return render_template('create_post.html', title='Update Post',
form=form, legend ='Update Post')
解决方案
在这个:
elif request.method == 'GET':
form.title.data = post.title
form.description.data = post.description
form.date_posted = post.date_posted
form.time_posted = post.time_posted
form.status.data = post.status
form.priority.data = post.priority
form.assigned_to.data = post.assigned_to
form.reported_by.data = post.reported_by
return render_template('create_post.html', title='Update Post',
form=form, legend ='Update Post')
form.date_posted
和中缺少“.data” form.time_posted
。更改如下:
form.date_posted.data = post.date_posted
form.time_posted.data = post.time_posted
推荐阅读
- sql - 如何从两个表中找到不相等的值
- javascript - 根据其他 HTML Select 填充 HTML Select 选项
- microservices - seneca - 两个微服务之间的通信
- c++ - 错误:在 {} [-Wnarrowing] 内缩小从 'int' 到 'char' 的 '199' 转换
- javascript - 在 nodejs 中渲染到新网页之前的警报消息
- for-loop - 如何从循环中打印(输出)多行?
- javascript - Javascript Mediasource 同时播放视频和音频?
- angular-cli - 在 ng-packagr 中禁用 TypeScript 不匹配
- python - 如何安装python启动器
- angular - Leaflet Tiles 无法在移动设备上的 Angular 中正确加载