#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. В конце концов, это было простое решение, но я понятия не имел об этом! Я отредактирую свой пост, чтобы показать фрагмент кода, который я использовал (который я должен был включить с самого начала). Еще раз спасибо, что помогли мне. Я очень ценю это!