gpt4 book ai didi

python - web2py:如何使用 SQLFORM.smartgrid 在删除之前执行指令

转载 作者:行者123 更新时间:2023-12-01 08:26:59 25 4
gpt4 key购买 nike

我使用 SQLFORM.smartgrid 显示表 (service_types) 中的记录列表。智能网格的每一行都有一个删除链接/按钮来删除记录。我想在 smartgrid/web2py 实际删除记录之前执行一些代码,例如我想知道是否有子记录(services 表)引用该记录,如果有,则闪烁一条消息告诉用户该记录无法删除。这是如何完成的?

db.py

db.define_table('service_types',
Field('type_name', requires=[IS_NOT_EMPTY(), IS_ALPHANUMERIC()]),
format='%(type_name)s',
)

db.define_table('services',
Field('service_name',requires=[IS_NOT_EMPTY(),IS_NOT_IN_DB(db,'services.service_name')]),
Field('service_type','reference service_types',requires=IS_IN_DB(db,db.service_types.id,
'%(type_name)s',
error_message='not in table',
zero=None),
ondelete='RESTRICT',
),
Field('interest_rate','decimal(15,2)',requires=IS_DECIMAL_IN_RANGE(0,100)),
Field('max_term','integer'),
auth.signature,
format='%(service_name)s',
)
db.services._plural='Services'
db.services._singular='Service'

if db(db.service_types).count() < 1:
db.service_types.insert(type_name='Loan')
db.service_types.insert(type_name='Contribution')
db.service_types.insert(type_name='Other')

Controller

def list_services():
grid = SQLFORM.smartgrid(db.services
, fields = [db.services.service_name,db.services.service_type]
)
return locals()

查看

{{extend 'layout.html'}}
{{=grid}}

最佳答案

有两个选项。首先,deletable 参数可以是一个函数,它接受给定记录的 Row 对象并返回 TrueFalse > 指示该记录是否可删除。如果返回False,则不会显示该记录的“删除”按钮,服务器上也不允许执行删除操作。

def can_delete(row):
return True if [some condition involving row] else False

grid = SQLFORM.smartgrid(..., deletable=can_delete)

其次,有一个 ondelete 参数,它接受 db Table 对象和记录 ID。它在删除操作之前调用,因此为了防止删除,您可以在该函数中进行重定向:

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 执行的,则在 ondelete 方法中使用 redirect (如上所示)将无法正常工作,因为重定向将不起作用,并且表行仍将从浏览器的网格中删除(即使数据库记录未删除)。在这种情况下,另一种方法是向浏览器返回非 200 HTTP 响应,这将阻止客户端 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)

请注意,deletableondelete 参数都可以是以表名作为键的字典,因此您可以为可能从智能网格链接的不同表指定不同的值.

最后,请注意删除 URL 类似于 /appname/list_services/services/delete/services/[record ID]。因此,在 Controller 中,您可以通过检查 request.args 中的 'delete' 来确定是否正在请求删除。在这种情况下,request.args[-2:] 表示表名称和记录 ID,您可以使用它们来执行任何检查。

关于python - web2py:如何使用 SQLFORM.smartgrid 在删除之前执行指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com