显示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) ))