1

我有一个 django 模型,命名Event为 的通用内联关系Relationship,如下所示:

# models.py

class Person(models.Model):
    ...

class Role(models.Model):
    ...

class Event(models.Model):
    ...

class Relationship(models.Model):
    person = models.ForeignKey(Person)
    role = models.ForeignKey(Role)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey("content_type", "object_id")

# admin.py

class RelationshipInline(generic.GenericTabularInline):
    model = Relationship
    extra = 0

class EventAdmin(admin.ModelAdmin):
    inlines = [RelationshipInline]

我想找到一种方法来编辑内联,不仅可以从事件管理页面,还可以从人员管理页面。到目前为止,我已经添加了以下代码来在人员页面中显示内联

class ReverseRelationshipInline(admin.TabularInline):
    model = Relationship

class IndividualAdmin(admin.ModelAdmin):
    inlines = [ReverseRelationshipInline]

但是我得到了表单中content_typeobject_id字段,对于管理员用户来说,它的信息量不是很大,因为它只是对主键的引用。我宁愿解决并显示content_object(即使它不可编辑,也可以在列表中知道人们与哪些对象相关)。

有什么方向可以推荐吗?

谢谢。

4

1 回答 1

1

您的“ReverseRelationshipInline”必须是 GenericTabularInline,而不是 TabularInline。就这样 :-)

更新

我想我现在明白你在追求什么,我的回答是:

您将无法编辑Person 内联的内容对象,但您希望很好地显示它,甚至可以作为其更改表单的链接。

向关系添加一个函数,该函数返回这样一个 HTML 链接,为您的内联提供您自己的 ModelForm 并指定您想要的字段,其中现在包括您的新函数值(只读)。像这样的东西(未经测试):

# models.py

from django.core import urlresolvers

class Relationship(models.Model):
    ...
    def link_content_object_changeform(self):
        obj = self.content_object
        change_url = urlresolvers.reverse(
            'admin:%s_%s_change' % (
                obj._meta.app_label,
                obj._meta.object_name.lower()
            ),
            args=(obj.id,)
        )
        return u'<a href="%s">%s</a>' % (change_url,  obj.__unicode__())
    link_content_object_changeform.allow_tags = True
    link_content_object_changeform.short_description = 'in relation to'

# admin.py

class ReverseRelationshipInlineForm(forms.ModelForm):
    class Meta:
        model = Relationship
        fields = ('person', 'role', 'link_content_object_changeform')
        readonly_fields = ('link_content_object_changeform',)

class ReverseRelationshipInline(admin.TabularInline):
    model = Relationship
    form = ReverseRelationshipInlineForm
于 2012-08-14T22:36:09.407 回答