【问题标题】:Django-admin linked column issueDjango-admin 链接栏问题
【发布时间】:2017-11-10 00:06:32
【问题描述】:

按照this 回答我想在我的管理页面中添加一个链接列,

class AnswerAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'link_to_question', 'time_created', 'time_updated', 'created_by', 'down_vote', 'up_vote')

    def link_to_question(self, obj):
        link = urlresolvers.reverse("admin:QnA_question_change",
                                    args=[obj.question.id])  # model name has to be lowercase
        text = obj.question.__str__
        str = format_html("{}", text)

        return mark_safe(u'<a href="%s">%s</a>' % (link, str))

    class Meta:
        model = Answer

但我得到的回报是:

<bound method Entry.__str__ of <Question: This is a question about technology?>>

我只想在我的管理员中显示“这是一个问题...”部分。

旁注: 当我使用 obj.question.text 之类的东西而不是函数时,它可以顺利运行。

【问题讨论】:

  • 应该是text = obj.question.__str__()

标签: python django django-admin


【解决方案1】:

只需设置方法的 allow_tags = True 属性。

class AnswerAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'link_to_question', 'time_created',    'time_updated', 'created_by', 'down_vote', 'up_vote')

    def link_to_question(self, obj):
        link = urlresolvers.reverse("admin:QnA_question_change",
                                args=[obj.question.id])  # model name has to be lowercase

        return u'<a href="{0}">{1}</a>'.format(link, obj.question)

    link_to_question.short_description = u'Link'
    link_to_question.allow_tags = True

【讨论】:

    【解决方案2】:

    不清楚您为什么使用format_html 然后将结果传递给mark_safe。您应该可以使用format_html 一步完成。这样做的好处是可以转义text,以防用户插入了恶意内容。

        link = urlresolvers.reverse(...)
        text = obj.question
        link_str = format_html('<a href="{}">{}</a>', link, text)
    

    要调用__str__ 方法,您需要使用obj.question.__str__() 调用它。但是,调用str(obj.question) 而不是obj.question.__str__() 更符合pythonic。在这种情况下,我认为您根本不需要使用str(),因为您使用的是format_html

    【讨论】:

    • 哦!而已!我没有调用该函数:))))谢谢伙计,非常感谢您的帮助!我只是在弄乱 format_html 和 mark_safe 以了解它们的作用:)) 在我的 str 函数中我将文本修剪为 150 个字符,这就是我在这里使用它的原因。
    • 您能否为以后可能阅读此内容的任何人修正您的答案?它应该是这样的: str = format_html("{}", link, text)
    • 我的意思是你不必显式调用str()__str__。它会被自动调用。
    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 2011-10-18
    • 2011-02-25
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2012-11-28
    • 2016-04-19
    相关资源
    最近更新 更多