Django Many to Many Inline - how to show fields referenced by through model?
django, django-1.6, django-admin, django-forms
Solution
Try this. Hope it solves your problem
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',)
Problem
I'm trying to customize and many to many inline in the django Admin, but I'm not able to display the fields of the underlying models. Here's a simplified example. Maybe you can tell me how to reference them? Here are my models: ``` 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) ``` and my admin: ``` class ClownInline(admin.TabularInline): model = WorkedAt fields = ['clown__name','clown__edit_link'] class CircusAdmin(admin.ModelAdmin): inlines = [ ClownInline, ] exclude = ('clowns',) ``` However I get this error: ``` Unknown field(s) (clown__name) specified for WorkedAt ``` (I'm on Django 1.6) Update: Why won't this work either. (Added calculated field to through model.) ``` 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) @property def edit_link(self): return self.clown.edit_link() ``` and my admin: ``` class ClownInline(admin.TabularInline): model = WorkedAt fields = ['edit_link'] class CircusAdmin(admin.ModelAdmin): inlines = [ ClownInline, ] exclude = ('clowns',) ```