Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Friendlier header for StackedInline for auto generated through model?

I'm using a Django admin StackedInline, as follows:

class BookInline(admin.StackedInline):
    model = Book.subject.through
    verbose_name = 'Book'
    verbose_name_plural = 'Books with this subject'

class SubjectAdmin(admin.ModelAdmin):
    inlines = [
        BookInline,
    ]

It all works, but the header is pretty ugly:

Books With This Subject
Book: Book_subject object

Anyone know how I can get rid of, or change, the Book_subject object part?

thanks!

like image 435
AP257 Avatar asked Feb 08 '11 02:02

AP257


2 Answers

I've never used an m2m field like this, so thanks! Learned something new.

I found 2 ways to get around the problem:

1: simply reassign the __unicode__ function with a new function

class MyInline(admin.TabularInline):
    MyModel.m2m.through.__unicode__ = lambda x: 'My New Unicode'
    model = MyModel.m2m.through

2: set up a proxy model for the m2m.through model and use that model instead

class MyThrough(MyModel.m2m.through):
    class Meta:
        proxy = True
    def __unicode__(self):
        return "My New Unicode"

class MyInline(admin.TabularInline):
    model = MyThrough
like image 166
Yuji 'Tomita' Tomita Avatar answered Oct 02 '22 13:10

Yuji 'Tomita' Tomita


For some reason, the (admittedly now old) accepted answer did not work for me.

This modification, however, did change the header:

MyModel.field.through.__str__ = lambda x: 'New Title'

Where field is the ManyToMany field.

like image 33
alstr Avatar answered Oct 02 '22 13:10

alstr