【问题标题】:django-tables2 exporting custom URL columndjango-tables2 导出自定义 URL 列
【发布时间】:2022-01-29 09:52:29
【问题描述】:

万事如意,

希望每个人都做得很好。

我有一个表格,我使用作为超链接的自定义列呈现。

问题是当我导出到 CSV 时,它只给我超链接的文本,而不是超链接。

我想导出超链接而不仅仅是文本,这可能吗? (如果我需要切换到 xlsx 导出也可以) (更糟的是我可以让文本成为完整路径)

自定义列:

document_link = tables.TemplateColumn('<a href="{{record.document_file.url}}/" target="_blank">{{record.document_file}}</a>', verbose_name="Document location")  

提前致谢,

【问题讨论】:

    标签: python django csv django-tables2 django-filters


    【解决方案1】:

    我建议使用“包含和排除列” https://django-tables2.readthedocs.io/en/latest/pages/export.html#including-and-excluding-columns

    exclude_from_export=True 添加到document_link 字段,以及一个不可见的document_link_for_csv 字段。

    class DocumentTable(tables.Table):
    
        document_link = tables.TemplateColumn(
            '<a href="{{record.document_file.url}}/" 
            target="_blank">{{record.document_file}}</a>', 
            verbose_name="Document location", 
            exclude_from_export=True
        )
        document_link_for_csv = columns.Column(
            visible=False, 
            accessor="document_file__url"
        )
    

    根据评论更新: 你可以pass the request through to the table,然后做自定义渲染和request.build_absolute_uri()

    class DocumentTable(tables.Table):
    
        document_link = tables.Column(
            verbose_name="Document location", 
            exclude_from_export=True
        )
        document_link_for_csv = columns.Column(
            visible=False, 
            accessor="document_file__url"
        )
    
        def render_document_link_for_csv(self, value, record):
            return format_html(
                '<a href="{}/{}/" target="_blank">{}</a>,
                request.build_absolute_uri(),
                record.document_file.url,
                record.document_file
            )
    

    【讨论】:

    • 我确实考虑过这一点,但是我的 document_file__url 仍然只会返回结尾 我将如何包含初始网站?在这种情况下本地主机?除非我只是手动输入链接(想想)
    • @ThomasLewin 是的,我可能会直接放入网址的第一部分。否则,您可以将请求传递到表中,然后使用 request.build_absolute_uri() 作为完整的 url。
    • @ThomasLewin 我已经用对你有用的方法更新了答案。
    • 我只是看到我错误地命名了render_foo() 方法(固定为render_document_link_for_csv,而不是render_id),这可能是也可能不是它对您不起作用的原因。
    • 覆盖值意味着类似于自定义表格单元格 rendering 的 render_document_link_for_csv(),您将创建一个 value_foo > value_document_link_for_csv() 方法来覆盖 value 的单元格。请注意,如果重命名为 render_document_link_for_csv 的修复不起作用,您可以尝试将方法重命名为 value_document_link_for_csv()。
    【解决方案2】:

    这是我设法做到的最后一种方式:

    class DocumentTable(ExportMixin,tables.Table):
    
        document_link = tables.TemplateColumn('<a href="{{record.document_file.url}}/" target="_blank">{{record.document_file}}</a>', verbose_name="Document location", exclude_from_export=True)  
        document_URL = tables.TemplateColumn('render_replaces_this',visible=False)
        
        def render_document_URL(self, value, record):
            return format_html(
                '{}{}',
                self.request.META['HTTP_HOST'],
                record.document_file.url,
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多