首页 文章

web2py:Grid csv exports显示id不是引用字段的值

提问于
浏览
2

表结构如 -

db.define_table('parent',
   Field('name'),format='%(name)s')

db.define_table('children',
   Field('name'),
   Field('mother','reference parent'),
   Field('father','reference parent'))
db.children.mother.requires = IS_IN_DB(db, db.parent.id,'%(name)s')
db.children.father.requires = IS_IN_DB(db, db.parent.id,'%(name)s')

控制器:

grid = SQLFORM.grid(db.children, orderby=[db.children.id],
                        csv=True, 
                        fields=[db.children.id, db.children.name, db.children.mother, db.children.father])

    return dict(grid=grid)

这里网格显示正确的值,即父表中母亲和父亲的名字 . 但是当我尝试通过csv链接导出它时 - 结果excelsheet显示id而不是母亲和父亲的名字 .

请帮忙!

1 回答

  • 1

    CSV下载只是为您提供原始数据库值,而无需先应用每个字段的 represent 属性 . 如果您想要每个字段的"represented"值,则有两个选项 . 首先,您可以选择TSV(制表符分隔值)下载而不是CSV . 其次,您可以定义自定义导出类:

    import cStringIO
    
    class CSVExporter(object):
        file_ext = "csv"
        content_type = "text/csv"
    
        def __init__(self, rows):
            self.rows = rows
    
        def export(self):
            if self.rows:
                s = cStringIO.StringIO()
                self.rows.export_to_csv_file(s, represent=True)
                return s.getvalue()
            else:
                return ''
    
    grid = SQLFORM.grid(db.mytable, exportclasses=dict(csv=(CSVExporter, 'CSV')))
    

    exportclasses 参数是自定义下载类型的字典,可用于覆盖现有类型或添加新类型 . 每个项目都是一个元组,包括导出器类和用于UI中下载链接的标签 .

    我们应该添加这个作为选项 .

相关问题