Передача пользовательского объекта python между Jinja2 и Flask - PullRequest
0 голосов
/ 11 апреля 2020

Я новичок в шаблонах Flask и Jinja2 и HTML, и я пытаюсь научиться передавать информацию между контроллером и представлениями. По сути, у меня есть календарь событий. Каждое имя события является гиперссылкой, которая использует от url_for до go для просмотра дополнительной информации об этом событии. Но хотя я легко могу передать список пользовательских объектов Event в файл HTML, я не знаю, как вернуть выбранный объект Event в контроллер. Из того, что я могу сказать, объект превращается в строку. Упрощенный код ниже.

app.py

from flask import Flask, render_template, url_for

app = Flask(__name__)

class Event(object):
    def __init__(self, name, date):
        self.name = name
        self.date = date

events = [Event('event1', '2020-04-11')]

@app.route('/')
def index():
    return render_template('index.html', events=events)


@app.route('/event/<event>')
def event(event):
    return render_template('event.html', event=event)

index. html

<!DOCTYPE html>
<html>
<body>
    {% for event in events %}
        <a href={{ url_for('event', event=event) }}>{{ event.name }}</a>
    {% endfor %}
</body>
</html>

событие. html

<!DOCTYPE html>
<html>
<body>
    <p>{{ event.name }} {{ event.date }}</p>
</body>
</html>

Нажатие на событие приводит меня к пустой странице, вероятно потому, что событие. html пытается получить атрибуты строкового объекта, который не существует.
Когда передача объекта python в представление настолько проста, кажется, что есть, вероятно, такой же простой способ вернуть его из поля зрения. Пожалуйста, просветите меня!

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020
@app.route('/event/<event>')

<event>, в данном случае, является строкой. См. Flask quickstart для подробностей об этом. Вы не можете передавать произвольные объекты через URL, как вы пытаетесь сделать здесь.

Как правило, у вас есть некоторый идентификатор здесь, который вы можете использовать для поиска объекта, возможно, в базе данных. В этом случае вы передадите этот идентификатор в url_for(), который выдаст URL-адрес типа /events/123.

Затем, когда вызывается ваш маршрут event, ему присваивается идентификатор в аргументе event , Затем вам нужно найти нужный объект и передать его в шаблон.

1 голос
/ 11 апреля 2020

Когда вы получаете <event>, это просто строка, а не объект. Таким образом, вы должны найти событие id в вашей базе данных, что-то вроде

@app.route('/event/<event>')
def event(event):
    e=db.find_event(event) # event is the event number or id 
    if e:
        return render_template('event.html', event=e)
    else:
        return f'Event {event} not found', 404
...