Flask и виджет выбора даты WTForm - PullRequest
0 голосов
/ 21 апреля 2020

В настоящее время у меня есть приложение, которое пишет сообщения и задает дату и время по умолчанию при написании сообщения. И новое сообщение, и сообщение редактирования редактируют один и тот же html create-post. html.

Я бы хотел, чтобы была возможность редактирования этого времени с помощью виджета выбора даты, как показано в этом вопросе: DatePickerWidget с Flask, Flask -Admin и WTforms

Я изо всех сил пытаюсь адаптировать мою текущую настройку без сбоя приложения.

В идеале:

  1. При создании нового сообщения виджет выбора даты показывает текущее время как стандартное (но это можно изменить, если требуется)
  2. При редактировании сообщения средство выбора даты показывает исходное время даты из БД. - но это может быть отредактировано при необходимости
  3. Формат: гггг-мм-дд чч: мм

Спасибо за любую помощь, он очень ценится

rout.py


@app.route("/post/new", methods=['GET', 'POST'])
# @login_required
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,
                    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)
    # 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.date_posted = form.date_posted.data.strftime('%Y-%m-%d')
        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.status.data = post.status
        form.priority.data = post.priority
        form.assigned_to.data = post.assigned_to
        form.reported_by.data = post.reported_by
        # form.date_posted.data = post.date_posted
    return render_template('create_post.html', title='Update Post',
            form=form, legend ='Update Post')

forms.py

from wtforms.fields.html5 import DateTimeField

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  = DateTimeField('Date and Time', format='%Y-%m-%d %H:%M')
    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')

models.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)
    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)

    def __repr__(self):
        return f"Post('{self.title}', '{self.date_posted}')"

create_post. html

{% block content %}
<div class="content-section">
        <form method="POST" action="">
            {{ form.hidden_tag() }}
            <div class="form-group" align="right">
                {{ form.submit(class="btn btn-outline-info white") }}
            </div>
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">{{ legend }}</legend>

                <div class="form-group">
                    {{ form.title.label(class="form-control-label") }}
                    {% if form.title.errors %}
                        {{ form.title(class="form-control form-control-lg is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form.title.errors %}
                                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.title(class="form-control form-control-lg") }}
                    {% endif %}
                </div>

                <div class="form-group">
                    {{ form.description.label(class="form-control-label") }}
                    {% if form.description.errors %}
                        {{ form.description(class="form-control form-control-lg is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form.description.errors %}
                                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.description(class="form-control form-control-lg") }}
                    {% endif %}
                </div>

                <div class="form-group">
                    {{ form.status.label(class="form-control-label") }}
                    {% if form.status.errors %}
                        {{ form.status(class="form-control form-control-lg is-invalid") }}
                        {# {{ form.status(rows=2, multiple=True) }}   #}
                        <div class="invalid-feedback">
                            {% for error in form.status.errors %}
                                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.status(class="form-control form-control-lg") }}
                    {% endif %}
                </div>

                <div class="form-group">
                    {{ form.priority.label(class="form-control-label") }}
                    {% if form.priority.errors %}
                        {{ form.priority(class="form-control form-control-lg is-invalid") }}
                        {# {{ form.priority(rows=2, multiple=True) }}   #}
                        <div class="invalid-feedback">
                            {% for error in form.priority.errors %}
                                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.priority(class="form-control form-control-lg") }}
                    {% endif %}
                </div>

                <div class="form-group">
                    {{ form.assigned_to.label(class="form-control-label") }}
                    {% if form.assigned_to.errors %}
                        {{ form.assigned_to(class="form-control form-control-lg is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form.assigned_to.errors %}
                                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.assigned_to(class="form-control form-control-lg") }}
                    {% endif %}
                </div>

                <div class="form-group">
                    {{ form.reported_by.label(class="form-control-label") }}
                    {% if form.reported_by.errors %}
                        {{ form.reported_by(class="form-control form-control-lg is-invalid") }}
                        <div class="invalid-feedback">
                            {% for error in form.reported_by.errors %}
                                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.reported_by(class="form-control form-control-lg") }}
                    {% endif %}
                </div>

            </fieldset>
            <div class="form-group" align="right">
                {{ form.submit(class="btn btn-outline-info white") }}
            </div>
            <p align="right"><a class="nav-item nav-link" href="{{ url_for('home') }}"><small>Return without save</small></a> <br></p>
        </form>
</div>
{% endblock content %}

enter image description here

...