显示djangopipe理员列表中的外键

如果一个Django模型包含一个外键字段,并且如果该字段以列表模式显示,那么它显示为文本 ,而不是显示到外部对象的链接

是否有可能自动显示所有的外键作为链接,而不是平面文字?

(当然,有可能在一个字段的基础上做到这一点,但是有一个通用的方法吗?)

例如

class Author(models.Model): ... class Post(models.Model): author = models.ForeignKey(Author) 

现在我select一个ModelAdmin,以便作者以列表模式显示:

 class PostAdmin(admin.ModelAdmin): list_display = [..., 'author',...] 

现在在列表模式下,author字段将使用Author类的__unicode__方法来显示作者。 最重要的是,我想要一个指向pipe理网站中相应作者url的链接 。 那可能吗?

手动方法

为了完整起见,我添加了手动方法。 这将是在PostAdmin类中添加一个方法author_link

 def author_link(self, item): return '<a href="../some/path/%d">%s</a>' % (item.id, unicode(item)) author_link.allow_tags = True 

这将适用于特定的领域,但这不是我想要的。 我想要一个通用的方法来达到同样的效果。 (其中一个问题是如何自动找出djangopipe理站点中对象的path。)

我不认为有一种机制可以自动开箱即用。

但是,根据对象的id来确定pipe理编辑页面的path,只需要两条信息即可:

a) self.model._meta.app_label

b) self.model._meta.module_name

然后,例如,要进入该模型的编辑页面,您应该这样做:

 '../%s_%s_change/%d' % (self.model._meta.app_label, self.model._meta.module_name, item.id) 

看看django.contrib.admin.options.ModelAdmin.get_urls看看他们是如何做到的。

我想你可以有一个可调用的模型名和一个id,创build一个指定types的模型来获得标签和名称(不需要命中数据库)并生成上面的URL。

但是你确定你不能使用内联吗? 这将使一个更好的用户界面,使所有相关的组件在一个页面中…

编辑:

内联(链接到文档)允许pipe理界面在一个页面中显示父子关系,而不是将其分解为两个。

在您提供的Post / Author示例中,使用内联意味着用于编辑Posts的页面还将显示用于添加/编辑/删除Authors的内联表单。 最终用户更自然。

您可以在pipe理列表视图中执行的操作是在Post模型中创build一个可调用对象,该对象将使用逗号分隔的作者列表。 因此,您将在Post列表视图中显示正确的作者,并直接在Postpipe理界面中编辑与post关联的作者。

我正在寻找同样的问题的解决scheme,并遇到这个问题…最终自己解决。 OP可能不再感兴趣,但对某人仍然有用。

 from functools import partial from django.forms import MediaDefiningClass class ModelAdminWithForeignKeyLinksMetaclass(MediaDefiningClass): def __getattr__(cls, name): def foreign_key_link(instance, field): target = getattr(instance, field) return u'<a href="../../%s/%s/%d">%s</a>' % ( target._meta.app_label, target._meta.module_name, target.id, unicode(target)) if name[:8] == 'link_to_': method = partial(foreign_key_link, field=name[8:]) method.__name__ = name[8:] method.allow_tags = True setattr(cls, name, method) return getattr(cls, name) raise AttributeError class Book(models.Model): title = models.CharField() author = models.ForeignKey(Author) class BookAdmin(admin.ModelAdmin): __metaclass__ = ModelAdminWithForeignKeyLinksMetaclass list_display = ('title', 'link_to_author') 

如果不使用python> = 2.5,用Django的“咖喱”replace“partial”。

请参阅https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#admin-reverse-urls

例:

 from django.utils.html import format_html def get_admin_change_link(app_label, model_name, obj_id, name): url = reverse('admin:%s_%s_change' % (app_label, model_name), args=(obj_id,)) return format_html('<a href="%s">%s</a>' % ( url, unicode(name) ))