【问题标题】:jinja2.exceptions.UndefinedError: 'None' has no attribute 'strftime'jinja2.exceptions.UndefinedError: 'None' 没有属性 'strftime'
【发布时间】:2020-02-21 19:54:07
【问题描述】:

不完全确定为什么会发生这种情况,但我收到以下错误。我要做的就是显示数据库中的日期和时间。当我从strftime 中删除('%I:%M %p') 时,一切正常,但显然,日期/时间不再显示。不知道出了什么问题,或者我错过了什么。 TIA。

jinja2.exceptions.UndefinedError
jinja2.exceptions.UndefinedError: 'None' has no attribute 'strftime'

Traceback (most recent call last)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask_login/utils.py", line 272, in decorated_view
return func(*args, **kwargs)
File "/Users/brandoncarr/Desktop/BlueSkyAdmin/app/routes.py", line 81, in view_tour
return render_template('view-tour.html', title='View Tour', tour=tour, user=user)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/templating.py", line 140, in render_template
ctx.app,
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/templating.py", line 120, in _render
rv = template.render(context)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/jinja2/environment.py", line 1090, in render
self.environment.handle_exception()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/jinja2/environment.py", line 832, in handle_exception
reraise(*rewrite_traceback_stack(source=source))
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/jinja2/_compat.py", line 28, in reraise
raise value.with_traceback(tb)
File "/Users/brandoncarr/Desktop/BlueSkyAdmin/app/templates/view-tour.html", line 1, in top-level template code
{% extends "base.html" %}
File "/Users/brandoncarr/Desktop/BlueSkyAdmin/app/templates/base.html", line 383, in top-level template code
{% block base %}{% endblock %}
File "/Users/brandoncarr/Desktop/BlueSkyAdmin/app/templates/view-tour.html", line 143, in block "base"
<p style="bottom: 0;">Created by <strong>{{ tour.author.first_name }} {{ tour.author.last_name }}</strong> at {{ tour.timestamp.strftime('%I:%M %p') }}</p>

models.py:

class Tours(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    customer_fname = db.Column(db.String(50))
    customer_lname = db.Column(db.String(50))
    customer_phone = db.Column(db.String(140))
    partner_fname = db.Column(db.String(100))
    partner_lname = db.Column(db.String(100))
    partner_phone = db.Column(db.String(100))
    region = db.Column(db.String(140))
    tour_date = db.Column(db.DateTime())
    tour_time = db.Column(db.DateTime())
    gift = db.Column(db.String())
    timestamp = db.Column(db.DateTime())
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __init__(self):
        return '<Tours {}>'.format(self.customer_fname, self.customer_lname, self.customer_phone, 
        self.partner_fname, self.partner_lname, self.partner_phone, self.region, self.tour_date, 
        self.tour_time, self.gift, self.timestamp)

forms.py:

class RegistrationForm(FlaskForm):
    first_name = StringField('First Name', validators=[DataRequired()])
    last_name = StringField('Last Name', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    password_repeat = PasswordField(
        'Repeat Password', validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Register Now')

    def validate_username(self, username):
        user = User.query.filter_by(username=username.data).first()
        if user is not None:
            raise ValidationError('Please use a different username.')

    def validate_email(self, email):
        user = User.query.filter_by(email=email.data).first()
        if user is not None:
            raise ValidationError('Please use a different email address.')

class ToursForm(FlaskForm):
    customer_fname = StringField('Customer First Name', validators=[DataRequired()])
    customer_lname = StringField('Customer Last Name', validators=[DataRequired()])
    customer_phone = StringField('Phone Number', validators=[DataRequired()])
    partner_fname = StringField('Partner First Name', validators=[DataRequired()])
    partner_lname = StringField('Partner Last Name', validators=[DataRequired()])
    partner_phone = StringField('Phone Number', validators=[DataRequired()])
    tour_date = DateField('Tour Date', format='%m-%d-%yyyy')
    tour_time = DateTimeField('Tour Time', format='%I:%M %p')
    gift = SelectField('Gift Selected', choices=[('Cruise', 'Cruise'), ('Hotel Suite', 'Hotel Suite'), ('Airfare', 'Airfare'), ('Safari', 'Safari')])
    region = SelectField('Region', choices=[('Select Region', 'Select Region'), ('Oceanside', 'Oceanside'), ('Scottsdale', 'Scottsdale'), ('Granite Bay', 'Granite Bay'), ('Laguna Hills', 'Laguna Hills')])
    submit = SubmitField('Add Tour')

routes.py:

@app.route('/tours/<int:id>/view')
@login_required
def view_tour(id):
    form = RegistrationForm()
    tour = Tours.query.get_or_404(id)
    user = User(first_name=form.first_name.data, last_name=form.last_name.data, 
    email=form.email.data)
    return render_template('view-tour.html', title='View Tour', tour=tour, user=user)

我的 HTML 文件中引发错误的代码:

{{ tour.timestamp.strftime('%I:%M %p') }}

再次感谢!

更新:

看起来我的模型在 tour_time 和时间戳上缺少 default=datetime.utcnow。删除它们后我忘了迁移我的数据库。一切又开始工作了。

【问题讨论】:

  • routes.py,view_tour函数中,你能打印并检查你是否得到tour的价值。
  • 时间戳似乎是无。这就是为什么您没有收到此错误的原因。尝试在 routes.py 中打印 tour.timestamp 的值并检查它是 None 还是有一些值。

标签: flask jinja2 flask-sqlalchemy flask-wtforms strftime


【解决方案1】:

菜鸟失误。确保您的 models.py 中的 DateTime 字段使用default=datetime.utcnow。感谢cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多