【问题标题】:Python forms for capturing date & time to SQLAlchemy用于将日期和时间捕获到 SQLAlchemy 的 Python 表单
【发布时间】:2020-06-27 02:36:11
【问题描述】:

我正在尝试在 python 和烧瓶中使用 wtf_form 让用户输入日期和时间,然后将其保存到 Sqlalchemy。我将分享我所拥有的,但现在我的烧瓶表单一旦填充就不会接受日期条目,当我提交表单时。它没有给我任何错误,所以我确信这是不匹配的。任何想法都非常感谢。非常感谢您的帮助。我目前使用 SQLite 作为我的数据库。

class Events(db.Model):

    __tablename__ = 'events'
    id = db.Column(db.Integer, primary_key=True)
    eventname = db.Column(db.Text(64))
    eventstart = db.Column(db.DateTime, nullable=False)
    eventstop = db.Column(db.DateTime, nullable=False)

    def __init__(
        self, eventname, eventstart, eventstop
    ):
        self.eventname = eventname
        self.eventstart = eventstart
        self.eventstop = eventstop

我的 forms.py 是:

# /myproject/events
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, IntegerField
from wtforms.validators import DataRequired
from wtforms.fields import DateField


# Building the form in order to get a date picker and save it to the database.
class RegistrationForm(FlaskForm):
    eventname = StringField('Event Name', validators=[DataRequired()])
    eventstart = DateField(
        'Enter start date and time', id='datepick', validators=[DataRequired()]
    )
    eventstop = DateField(
        'Enter end date and time', id='datepick', validators=[DataRequired()]
    )
    submit = SubmitField('Register!')

我的 view.py 是:

from myproject import app, db
from flask import (
    render_template, redirect, url_for, flash,
    Blueprint, request
)
from flask_login import login_user, login_required, logout_user
from myproject.models import Events
from myproject.events.forms import RegistrationForm
import validators
from flask_bootstrap import Bootstrap

Bootstrap(app)

events_blueprint = Blueprint(
    'events', __name__,
    template_folder='templates/events'
)

# @login_required
@events_blueprint.route('/add', methods=['GET', 'POST'])
def register():
    try:
        form = RegistrationForm()

        if form.validate_on_submit():
            event = Events(
                eventname=form.eventname.data,
                eventstart=form.eventstart.data,
                eventstop=form.eventstop.data,
            )

            db.session.add(event)
            db.session.commit()
            flash("Thank you for registering your event.")
            return redirect(url_for('list_event'))

        return render_template('add.html', form=form)
    except Exception as e:
        print(e)

最后,我的 HTML 是:

{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}This is an example page{% endblock %}

{% block head %}
  {{ super() }}
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css">
{% endblock %}

{% block content %}
  <div class="container">
    <h1>Hello, Bootstrap</h1>
    <div class="row">
      <div class='col-sm-6'>
        <form method="POST">
          {{form.hidden_tag()}}
          {{form.eventname.label}}{{form.eventname()}}<br><br>
          {{form.eventstart.label}}{{form.eventstart()}}<br><br>
          {{form.eventstop.label}}{{form.eventstop()}}<br><br>
          {{form.submit()}}
      </form>
      </div>
    </div>
  </div>
{% endblock %}

{% block scripts %}
  {{ super() }}
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>
  <script type="text/javascript">
    $(function () {
      $('#datepick').datetimepicker();
    });
  </script>
{% endblock %}

【问题讨论】:

  • 如果没有错误,你怎么知道提交表单时它不接受日期输入?
  • 好问题。我将尝试插入一个 if print 语句以查看它是否失败,然后了解它失败的字段。您将如何尝试找出错误?谢谢!
  • 在您的控制台/终端中
  • 我没有在if form.validate_on_submit(): 之后打印它,这意味着它没有验证。如何更好地解决验证问题?谢谢。
  • 尝试在 view.py 文件中包围 register 函数,使用 try-catch 块 w3schools.com/python/python_try_except.asp 。看看有没有异常(记得打印异常用catch Exception as e: print(e)

标签: python flask flask-sqlalchemy flask-wtforms


【解决方案1】:

问题是当您将表单信息保存到数据库中时。您已经在 models.py 中正确地将事件开始和事件停止声明为 Datetime 对象,并且您还正确地使用了 Flask-WTF 的 DateField 输入,因此前端的一切看起来都是正确的,但是当您获得日期时从表单中,它以字符串形式返回,需要将其解析并格式化为日期。幸运的是,有办法做到这一点!

将以下导入添加到您的 view.py 文件并进行这些编辑以在您的数据库中创建事件。

    from datetime import datetime
    ... 

    eventstart=datetime.strptime(form.eventstart.data, '%Y-%m-%d')
    eventstop=datetime.strptime(form.eventstop.data, '%Y-%m-%d')

这应该可以解决它!希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2017-03-24
    • 1970-01-01
    • 2021-06-09
    • 2014-06-24
    相关资源
    最近更新 更多