【问题标题】:How to link to a different object fom a Django admin view?如何从 Django 管理视图链接到不同的对象?
【发布时间】:2011-08-18 07:57:44
【问题描述】:

我创建了一个自定义管理类来在我的 Django 应用程序中显示 Comments Admin。我想做的是让“对象 ID”下的项目链接到它们各自对象的编辑对象页面。我将如何实现这一目标?

我的评论管理员:

class MyCommentsAdmin(admin.ModelAdmin):
    fieldsets = (
        (_('Content'),
           {'fields': ('user', 'user_name', 'user_email', 'user_url', 'comment')}
        ),
        (_('Metadata'),
           {'fields': ('submit_date', 'ip_address', 'is_public', 'is_removed')}
        ),
     )

    list_display = ('id', 'name', 'comment', 'content_type', 'object_pk', 'ip_address', 'submit_date', 'is_public', 'is_removed')
    list_filter = ('submit_date', 'site', 'is_public', 'is_removed')
    date_hierarchy = 'submit_date'
    list_display_links = ('id','comment',)
    ordering = ('-submit_date',)
    raw_id_fields = ('user',)
    search_fields = ('comment', 'user__username', 'user_name', 'user_email', 'ip_address')

admin.site.unregister(Comment)
admin.site.register(Comment, MyCommentsAdmin)

谢谢!!

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    在管理类上定义一个自定义方法并在您的 list_display 元组中引用它。

    from django.core.urlresolvers import reverse
    class MyCommentsAdmin(admin.ModelAdmin):
    
        list_display = ('id', 'name', 'comment', 'content_type', 'object_link', 'ip_address', 'submit_date', 'is_public', 'is_removed')
        list_select_related = True
    
        def object_link(self, obj):
            ct = obj.content_type
            url = reverse('admin:%s_%s_change' % (ct.app_label, ct.model), args=(obj.id,)) 
            return '<a href="%s">%s</a>' % (url, obj.id)
        object_link.allow_tags = True
    

    请注意,我添加了list_select_related=True,因为 object_link 方法引用了 content_type 模型,否则会导致大量额外查询。

    【讨论】:

    • 谢谢。这里某处有一个小错误。返回的id 不是对象的ID,而是评论自己的ID。我该如何解决这个问题?
    • 我将obj.id 更改为obj.object_pk。谢谢!
    • 我使用的是 Django 1.7,需要将 obj.content_type 更改为 obj._meta 并将 ct.model 更改为 ct.model_name
    • 实际上对于高于 1.7 的版本,您也必须这样做。如果您使用的是 Django 2,还可以使用 mark_safe_decorator 而不是 object_link.allow_tags = True
    【解决方案2】:

    这是一个很好的答案,但它已经发生了显着变化。 这个答案更适用于Django 3.2.3

    from django.urls import reverse
    from django.utils.safestring import mark_safe
    
    class MyCommentsAdmin(admin.ModelAdmin):
    
        list_display = (
            'id', 'name', 'comment', 'content_type', 'object_link', 'ip_address',
            'submit_date', 'is_public', 'is_removed'
        )
    
        def object_link(self, obj):
            app_label = obj._meta.app_label
            model_label = obj._meta.model_name
            url = reverse(
                f'admin:{app_label}_{model_label}_change', args=(obj.id,)
            ) 
            return mark_safe(f'<a href="{url}">{obj.id}</a>')
    

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2014-10-31
      • 2011-07-02
      • 2012-04-12
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      相关资源
      最近更新 更多