jinja2.exceptions.UndefinedError: «None» не имеет атрибута «strftime» - PullRequest
0 голосов
/ 21 февраля 2020

Не совсем уверен, почему это происходит, но я получаю следующую ошибку. Все, что я пытаюсь сделать, это отображать даты и время из моей базы данных. Когда я удаляю ('%I:%M %p') из strftime, все работает нормально, но, очевидно, даты / время больше не отображаются. Не уверен, что идет не так, или что я скучаю. ТИА.

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')

rout.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') }}

Еще раз спасибо!

ОБНОВЛЕНИЕ:

Похоже, мои модели пропустили default=datetime.utcnow на tour_time и timestamp. Я забыл перенести мою базу данных после их удаления. Все снова заработало.

1 Ответ

0 голосов
/ 22 февраля 2020

Грач ie Ошибка. Убедитесь, что ваши поля DateTime в вашем models.py используют default=datetime.utcnow. Спасибо за комментарии.

...