【问题标题】:How do I use allow_tags in django 2.0 admin?如何在 django 2.0 admin 中使用 allow_tags?
【发布时间】:2018-06-05 19:51:43
【问题描述】:

删除了对 ModelAdmin 方法的 allow_tags 属性的支持。

【问题讨论】:

    标签: python django


    【解决方案1】:

    刚刚找到答案,使用mark_safe函数。

    在旧代码中,您可以使用:

    def image_(self, obj):
        return '<image src="%s" />' % obj.image
    image_.allow_tags = True
    

    在新代码中,您应该使用:

    from django.utils.safestring import mark_safe
    def image(self, obj):
        return mark_safe('<image src="%s" />' % obj.image)
    

    【讨论】:

    【解决方案2】:

    除了其他答案,您还可以使用 mark_safe 函数作为装饰器:

    from django.utils.safestring import mark_safe
    
    @mark_safe
    def icon_pw(self, obj):
        return f'<img src="{obj.icon.url}" />' if obj.icon else ''
    icon_pw.short_description = 'Icon'
    icon_pw.allow_tags = True
    

    这是将旧的 Django 管理代码升级到 2.0 的简单方法。

    【讨论】:

      【解决方案3】:

      如果您的代码在 admin.py 中,您可以覆盖仅添加 mark_safe 函数,如下例所示:

      from django.utils.safestring import mark_safe
      
      def get_image_tag(self):
              if self.picture:
                  return mark_safe('<img src="%s" width="60" height="75" />' % self.picture.url)
              else:
                  return ' '
      get_image_tag.short_description = 'Photo'
      #get_image_tag.allow_tags = True #redundant
      get_image_tag.admin_order_field = 'name'
      

      此代码已在 Django 2.0.2 和 Python 3.6.4 中测试。

      【讨论】:

        【解决方案4】:

        TL;DR:您可能应该使用 format_html() 而不是 mark_safe,正如其他答案所建议的那样。

        其他答案推荐使用mark_safe 的方式只会将整个结果字符串标记为安全的HTML。 IOW,您是在告诉 Django “这是有效且安全的 HTML,我已确保发生任何需要的转义”。除了其他答案实际上并没有进行所需的转义。

        从另一个答案中考虑以下(不完美的)方法:

        from django.utils.safestring import mark_safe
        def image(self, obj):
            return mark_safe('<image src="%s" />' % obj.image)
        

        如果 obj.image 现在包含 ",或者更糟的是,是用户输入并包含 XSS 攻击,这将破坏生成的 HTML。

        为了防止这种情况发生,所有插入这样的 HTML sn-ps 的数据都应该事先单独转义。幸运的是,html_format() function 既可以进行插值,也可以进行所需的转义。这样,上面的例子就变成了:

        from django.utils.html import format_html
        def image(self, obj):
            return format_html('<image src="{}" />', obj.image)
        

        请注意,他使用{} 格式字符串而不是%s,因为format_html() 是基于str.format(),它使用该样式。

        【讨论】:

          猜你喜欢
          • 2013-04-30
          • 2013-05-05
          • 2012-05-09
          • 2021-03-24
          • 1970-01-01
          • 2022-12-14
          • 2019-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多