首页 > 解决方案 > 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')

在此处输入图像描述

标签: flaskflask-wtforms

解决方案


在这个:

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

推荐阅读