Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django admin中向字段添加可单击链接?_Python_Django - Fatal编程技术网

Python 如何在Django admin中向字段添加可单击链接?

Python 如何在Django admin中向字段添加可单击链接?,python,django,Python,Django,我有这个管理员 class LawyerAdmin(admin.ModelAdmin): fieldsets = [ ('Name', {'fields': ['last', 'first', 'firm_name', 'firm_url', 'school', 'year_graduated']}), ] list_display = ('last', 'first', 'school', 'year_graduated', 'firm_name',

我有这个管理员

class LawyerAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Name',   {'fields': ['last', 'first', 'firm_name', 'firm_url', 'school', 'year_graduated']}),
    ]
    list_display = ('last', 'first', 'school', 'year_graduated', 'firm_name', 'firm_url')
    list_filter = ['school', 'year_graduated']
    search_fields = ['last', 'school', 'firm_name']

我想让“firm_url”字段与字段中列出的每个url一起单击。我该怎么做?谢谢。

在LawyerAdmin类中定义一个自定义方法,以HTML形式返回链接:

def show_firm_url(self, obj):
    return '<a href="%s">%s</a>' % (obj.firm_url, obj.firm_url)
show_firm_url.allow_tags = True
def显示公司url(self,obj):
返回“”%(obj.firm\u url,obj.firm\u url)
显示\u firm\u url.allow\u tags=True

请参阅。

显示公司url
添加到
列表显示中

但它会覆盖my models中指定的文本显示,并在列的标题上显示“show firm url”

您可以通过指定“简短描述”属性进行更改:

show_firm_url.short_description = "Firm URL"

使用
format\u html
实用程序。这将从参数中转义任何html,并将字符串标记为可在模板中安全使用。Django 1.9中已弃用了
allow_tags
method属性

from django.utils.html import format_html

class LawyerAdmin(admin.ModelAdmin):
    list_display = ['show_firm_url', ...]
    ...

    def show_firm_url(self, obj):
        return format_html("<a href='{url}'>{url}</a>", url=obj.firm_url)

    show_firm_url.short_description = "Firm URL"
    
来自django.utils.html导入格式\u html
类LawyerAdmin(admin.ModelAdmin):
列表显示=['show\u firm\u url',…]
...
def显示公司url(自身、obj):
返回格式\u html(“,url=obj.firm\u url)
显示公司url.short\u description=“公司url”
现在,即使在以下情况下,您的管理员用户也是安全的:

firm_url == 'http://a.aa/<script>eval(...);</script>'
firm_url=='http://a.aa/eval(...);'

有关更多信息,请参阅。

如果愿意,您可以在模型中处理它:

在models.py中:

class Foo(models.Model):
...


     def full_url(self):
        url = 'http://google.com'
        from django.utils.html import format_html
        return format_html("<a href='%s'>%s</a>" % (url, url))

是的,我做了,现在它工作了,谢谢。但它会覆盖my models中指定的文本显示,并在列的标题上显示“show firm url”。我不知道是否有办法解决这个问题,但我将“show\u firm\u url”改为“Bio\u link”,现在一切都好了。改用。它更安全。这容易受到HTML注入的攻击。例如,
obj.firm\u url
可以是
http://example.com/alert(“我是邪恶的”)
这是不推荐的,因为django 1.11使用了
标记安全
而不是
允许标记
这很有帮助,我可以在模型页面中看到一个单独的列。但是如何在模板中使用这个呢?我试过
{{obj.show\u firm\u url}}
,但它不起作用。我应该如何将其整合到模板中?这里是一篇关于最新解决方案的帖子:IMHO应该是正确的答案。从这里我可以看到管理员网站外的OP通缉链接。但那不是我的情况,所以我最终使用了
列表显示链接
。不,@ViniciusSilva不是我的答案。OP想要一个链接到
公司url
的值,显然,因为它是一个url。似乎是两件不同的事情,我是通过谷歌来到这里的,而对我来说,另一个答案是使用
列表显示链接来实现的。这应该是选择的答案,因为它可以防止eval脚本攻击
    list_display = ('full_url', ... )