Django多对多内联-如何通过模型显示引用的字段?

Django多对多内联-如何通过模型显示引用的字段?,django,django-forms,django-admin,django-1.6,Django,Django Forms,Django Admin,Django 1.6,我试图在django管理中进行自定义和多对多内联,但无法显示底层模型的字段 这里有一个简化的例子。也许你能告诉我如何引用它们 以下是我的模型: class Clown(models.Model): name = models.CharField(max_length=255) def edit_link(self): return ... class Circus(models.Model): clowns = models.ManyToManyFiel

我试图在django管理中进行自定义和多对多内联,但无法显示底层模型的字段

这里有一个简化的例子。也许你能告诉我如何引用它们

以下是我的模型:

class Clown(models.Model):
    name = models.CharField(max_length=255)
    def edit_link(self):
        return ...

class Circus(models.Model):
    clowns = models.ManyToManyField(Clown, blank=True, through='WorkedAt')
    name = models.CharField(max_length=255)

class WorkedAt(models.Model):
    clown = models.ForeignKey(Clown)
    circus = models.ForeignKey(Circus)
我的管理员:

class ClownInline(admin.TabularInline):
    model = WorkedAt
    fields = ['clown__name','clown__edit_link']


class CircusAdmin(admin.ModelAdmin):
    inlines = [
        ClownInline,
    ]
    exclude = ('clowns',)
class ClownInline(admin.TabularInline):
    model = WorkedAt
    fields = ['edit_link']


class CircusAdmin(admin.ModelAdmin):
    inlines = [
        ClownInline,
    ]
    exclude = ('clowns',)
但是我得到了这个错误:

Unknown field(s) (clown__name) specified for WorkedAt
(我在Django 1.6上)

更新: 为什么这也行不通呢。(将计算字段添加到整个模型中。)

我的管理员:

class ClownInline(admin.TabularInline):
    model = WorkedAt
    fields = ['clown__name','clown__edit_link']


class CircusAdmin(admin.ModelAdmin):
    inlines = [
        ClownInline,
    ]
    exclude = ('clowns',)
class ClownInline(admin.TabularInline):
    model = WorkedAt
    fields = ['edit_link']


class CircusAdmin(admin.ModelAdmin):
    inlines = [
        ClownInline,
    ]
    exclude = ('clowns',)

试试这个。希望它能解决你的问题

class ClownInline(admin.TabularInline):
    model = WorkedAt
    fields = ['clown_name', 'clown_edit_link']
    readonly_fields = ['clown_name', 'clown_edit_link']

    def clown_name(self, instance):
        return instance.clown.name
    clown_name.short_description = 'clow name'

    def clown_edit_link(self, instance):
        url = reverse("admin:%s_%s_change" % (instance.clown._meta.app_label, instance.clown._meta.module_name), args=(instance.clown.pk,))
        return '<a href="%s">%s</a>' % (url, instance.clown.name)
    clown_edit_link.allow_tags = True


class CircusAdmin(admin.ModelAdmin):
    inlines = [
        ClownInline,
    ]
    exclude = ('clowns',)
类内联(管理列表行):
模型=工作数据
字段=['小丑名称','小丑编辑链接']
只读_字段=[“小丑_名称”,“小丑_编辑_链接”]
def小丑_名称(自身,实例):
return instance.journ.name
小丑的名字。简短的描述='clow名字'
def小丑编辑链接(自身,实例):
url=reverse(“管理员:%s\u%s\u更改”%”(instance.小丑.\u meta.app\u标签,instance.小丑.\u meta.module\u名称),args=(instance.小丑.pk)
返回“”%(url,实例.小丑.名称)
小丑\u编辑\u链接。允许\u标记=真
类管理员(admin.ModelAdmin):
内联线=[
小丑,,
]
排除=(‘小丑’,)

我不知道是否还有人需要这个,因为这个问题已经问了4年了,但这解决了我在
Django 2.0.3
中遇到的问题:

# models.py
class Clown(models.Model):
    name = models.CharField(max_length=255)
    def edit_link(self):
        return ...


class Circus(models.Model):
    clowns = models.ManyToManyField(Clown, blank=True, through='WorkedAt')
    name = models.CharField(max_length=255)


class WorkedAt(models.Model):
    clown = models.ForeignKey(Clown)
    circus = models.ForeignKey(Circus)


# admin.py
class WorkedAtInline(admin.TabularInline):
    model = WorkedAt
    extra = 1


class WorkedAtAdmin(admin.ModelAdmin):
    inlines = (WorkedAtInline,)


admin.site.register(Clown, WorkedAtAdmin)

希望这能帮助那些偶然发现这个问题并研究这个答案的人。

字段必须是
WorkedAt
模型中的数据库字段。它不能是基础模型的字段。在这种情况下,您可以在
Circus
模型上使用内联as
小丑
,并删除
工作和
altogetherOk,查看我的更新。如果我在直通模型中添加了一个方法,为什么连它都不会显示出来?你能发布堆栈跟踪吗?同时定义
字段和
只读字段应该可以。非常感谢你的尝试!由于某种原因,它仍然不起作用。我甚至让your方法jufforeinline.juffore\u name返回一个简单的字符串“test”来排除任何问题,但它仍然找不到字段juffore\u name。