2015-11-01 30 views
0

我在SQLFORM.grid中有一个自定义控制器,我正在使用链接。问题是(因此它似乎),因为我在我的自定义函数工作时使用左连接,编辑和查看不起作用。关于左连接问题的web2py sqlform网格链接

所以我的链接如下

links = [lambda row: A('',_class='glyphicon glyphicon glyphicon-remove-sign', 
        callback=URL('settings','deactivate',vars=dict(table='workers_skills',field = 'ws_status' 
        ,value = row.workers_skills.id)))] 

我的网格构造

grid_workersskills= SQLFORM.grid(query=query,left=[db.workers.on(db.workers_skills.ws_worker==db.workers.id), 
      db.skills.on(db.workers_skills.ws_skill==db.skills.id)], 
      fields=fields, searchable=False, orderby=[db.workers.w_nick_name],create=True, 
      deletable=False, editable=True, paginate=50, buttons_placement = 'right', 
      showbuttontext = False, 
      links = links, 
      #oncreate=myfunction, 
      ui = dict(widget='', 
       header='', 
       content='', 
       default='', 
       cornerall='', 
       cornertop='', 
       cornerbottom='', 
       button='button btn btn-default', 
       buttontext='buttontext button', 
       buttonadd='icon plus icon-plus glyphicon glyphicon-plus', 
       buttonback='icon leftarrow icon-arrow-left glyphicon glyphicon-arrow-left', 
       buttonexport='icon downarrow icon-download glyphicon glyphicon-download', 
       buttondelete='icon trash icon-trash glyphicon glyphicon-trash', 
       buttonedit='icon pen icon-pencil glyphicon glyphicon-pencil', 
       buttontable='icon rightarrow icon-arrow-right glyphicon glyphicon-arrow-right', 
       buttonview='icon magnifier icon-zoom-in glyphicon glyphicon-eye-open', 
      ), 
      exportclasses = dict(csv_with_hidden_cols=False, html = False, tsv = False, tsv_with_hidden_cols=False, json = False)) 

问题是由row.workers_skills.id

如果我继续保持这样我的功能停用造成的工作正常,但是当我点击编辑或查看记录时出现错误

Row attribute has no object workers_skills 

如果我把它放到row.id中查看和编辑工作,但是我的停用函数不是因为ID或记录没有创建。

上周我一直在为此付出努力。请帮助

谢谢

回答

2

当电网涉及连接,则必须通过row.table.field格式是指字段的行内。但是,当您从这种网格查看/编辑记录时,只会显示单个表格中的记录(即不再包含连接),因此您现在必须通过row.field格式引用一行内的字段。因为您的“链接”出现在网格以及视图/编辑页面中,无论您使用哪种格式引用id字段,都会导致这两种情况之一发生错误。

所以,你需要做的就是确保你的代码在两种情况下工作。这里有一个简单的一招:

相反的:

row.workers_skills.id 

做:

row.get('workers_skills', row).id 

.get()方法试图检索 'workers_skills' 键,但如果它不存在,它代替返回一个默认值,在这种情况下,它只是原始行。然后它检索返回对象的“id”字段(原始行或row.workers_skills子行)。

+0

非常感谢。有用 – Yebach