Есть два варианта. Во-первых, аргумент deletable
может быть функцией, которая принимает объект Row
данной записи и возвращает True
или False
, чтобы указать, является ли запись удаляемой. Если он возвращает False
, кнопка «Удалить» не будет отображаться для этой записи, и операция удаления не будет разрешена на сервере.
def can_delete(row):
return True if [some condition involving row] else False
grid = SQLFORM.smartgrid(..., deletable=can_delete)
Во-вторых, есть аргумент ondelete
, который принимает объект db
Table
и идентификатор записи. Он вызывается непосредственно перед операцией удаления, поэтому для предотвращения удаления вы можете выполнить перенаправление внутри этой функции:
def ondelete(table, record_id):
record = table(record_id)
if [some condition]:
session.flash = 'Cannot delete this record'
redirect(URL())
grid = SQLFORM.smartgrid(..., ondelete=ondelete)
Обратите внимание: если сетка загружается через компонент Ajax, и поэтому ее действия выполняются через Ajax, использование redirect
в методе ondelete
, как показано выше, не будет работать должным образом, поскольку перенаправление не будет иметь никакого эффекта, и Строка таблицы все равно будет удалена из сетки в браузере (даже если запись базы данных не была удалена). В этом случае альтернативный подход заключается в возврате HTTP-ответа не-200 в браузер, что не позволит Javascript на стороне клиента удалить строку из таблицы (удаление происходит только при успешном выполнении запроса Ajax). Мы также должны установить response.flash
вместо session.flash
(потому что мы не перенаправляем / перезагружаем всю страницу):
def ondelete(table, record_id):
record = table(record_id)
if [some condition]:
response.flash = 'Cannot delete this record'
raise HTTP(403)
Обратите внимание, что аргументы deletable
и ondelete
могут быть словарями с именами таблиц в качестве ключей, так что вы можете указывать разные значения для разных таблиц, которые могут быть связаны из smartgrid.
Наконец, обратите внимание, что URL-адреса для удаления выглядят как /appname/list_services/services/delete/services/[record ID]
. Таким образом, в контроллере вы можете определить, запрашивается ли удаление, проверив, если 'delete' in request.args
. В этом случае request.args[-2:]
представляет имя таблицы и идентификатор записи, которые вы можете использовать для любых проверок.