Как использовать Flask LinkCol в результатах запроса данных базы данных?

#python #flask #flask-sqlalchemy #crud #flask-table

#python #flask #flask-sqlalchemy #crud #flask-таблица

Вопрос:

Я некоторое время работал с Flask и разработал приложение database Manager для управления внутренними данными для отдела, в котором я работаю (я не «настоящий» разработчик, но научился делать / необходимость). Приложение отлично работает как базовое CRUD-приложение. В нем я использовал формы и таблицы Flask, включая столбец LinkCol, для ссылок на различные функции в приложении. В этих случаях я использую интерактивную ссылку «Редактировать» или «Удалить»; это означает, что в каждом столбце таблицы есть дополнительная ячейка с этим словом. Нажатие любого из них переводит пользователя на соответствующую страницу, где он может предпринять соответствующие действия по этому элементу.

В настоящее время я пытаюсь использовать LinkCol, чтобы данные, возвращаемые из базы данных, могли быть интерактивной ссылкой, которая ссылается на другую функцию, а не на каждую таблицу, имеющую дополнительный столбец (например, «Перейти к учетной записи»).). Таким образом, когда моя таблица заполняется номером учетной записи, пользователь может щелкнуть фактический номер учетной записи в таблице, чтобы перейти на другую страницу для просмотра дополнительных данных об этой конкретной учетной записи. Я прочитал документы и просмотрел примеры на странице создателей, касающиеся перезаписи элементов в классах, но не смог разобраться в этом. Я написал несколько своих собственных классов, но ни в коем случае не являюсь экспертом в этом вопросе. Я также не смог найти ничего другого, что могло бы помочь, в том числе на SO, который всегда является моим ресурсом для выяснения вещей.

Вот мое определение таблицы с использованием LinkCol, которое отображается неправильно и помещает ‘Account #’ в каждую ячейку вместо динамических данных, которые я хотел бы. Изменение на Col дает правильное отображение, но я хочу, чтобы оно было интерактивным:

 class AccountsResults(MainTable):
    AccNo = LinkCol('Account #','dbhome_bp.route.account_detail', url_kwargs=
           dict(AccNo='AccNo',StatusCode='Active',ServiceAddress1=
           'ServiceAddress1'))
    TnCount = Col('Total TNs')
    ServiceAddress1 = Col('Service Address')
    ServiceCity = Col('Service City')
    ServiceZip = Col('Service Zip Code')
    MasterServiceDate = Col('Master Service Date')
    Active = Col('Currently Active')
 

Вот пример того, что я знаю, что могу сделать, в сравнении с тем, что я хотел бы сделать.
Можно сделать («Перейти к учетной записи» можно щелкнуть в столбце «Перейти к учетной записи»):

Перейдите к учетной записи Учетная запись # Адрес службы И т.д.
Перейдите к учетной записи 12345678 1234 Где угодно Да
Перейдите к учетной записи 12345679 Где-то 5678 Нет

Хотел бы сделать (номера учетных записей доступны в столбце Account #):

Учетная запись # Адрес службы И т.д.
12345678 1234 Где угодно Да
12345679 Где-то 5678 Нет

Кто-нибудь знает, как сделать динамические данные, возвращаемые из запроса, доступной для просмотра ссылкой для LinkCol в таблице Flask?

Любая помощь приветствуется.

Ответ №1:

Предполагая модель Sqlalchemy Account со столбцом PK id и маршрутом, определенным следующим образом:

 accounts = Blueprint('accounts', __name__)
@accounts.route("/accounts/<int:account_id>")
def detail(self, account_id):

    _account = Account.get_or_404(account_id)
    # show account details
    return render('account-details.html', account=_account)
 

Определите столбец ссылки вашей учетной записи следующим образом:

 account = LinkCol(
    name='Account #',
    attr='id',
    endpoint='accounts.detail',
    url_kwargs=dict(account_id='id'),
)
 

Значения параметров следующие:

 name # the column header text
attr # the name of the attribute of the account object to render as the text in the <td> cell
endpoint # the endpoint to link to
url_kwargs # the arguments that get passed to the url_for function along with the endpoint
 

Ссылки будут построены так, как если бы вы сделали url_for для каждой строки в таблице следующим образом:

 _row_account_detail_url = url_for('accounts.detail', account_id=row_id)
 

Пример определения таблицы:

 class AccountTable(Table):

    account = LinkCol(
        name='Account #',
        attr='id',
        endpoint='accounts.detail',
        url_kwargs=dict(account_id='id'),
    )

    service_address = Col(
        'Service Address',
        attr='service_address'
    )

    #  other columns
 

Комментарии:

1. большое вам спасибо. Это сработало! Я думаю, что моя ошибка заключалась в том, что я не использовал ключевое слово attr, как вы сделали для отображения объекта account в ячейке td. В конце концов, это было простое решение, но я понятия не имел об этом! Я отредактирую свой пост, чтобы показать фрагмент кода, который я использовал (который я должен был включить с самого начала). Еще раз спасибо, что помогли мне. Я очень ценю это!