2011-02-03 55 views
12

比方說,我有書籍和作者模型。如何在我的Django管理站點上啓用內聯ManyToManyFields?

class Author(models.Model): 
    name = CharField(max_length=100) 

class Book(models.Model): 
    title = CharField(max_length=250) 
    authors = ManyToManyField(Author) 

我想每本書有多個作者,並在Django管理站點我希望能夠將多個新作者從它的編輯頁面添加到書,一氣呵成。我不需要將書籍添加到作者。

這可能嗎?如果是這樣,完成它的最好和/或最簡單的方法是什麼?

回答

16

這是很簡單的事情,你想要什麼,如果我正確地得到你:

您應該創建一個admin.py文件,你的應用程序目錄中,然後編寫以下代碼:

from django.contrib import admin 
from myapps.models import Author, Book 

class BookAdmin(admin.ModelAdmin): 
    model= Book 
    filter_horizontal = ('authors',) #If you don't specify this, you will get a multiple select widget. 

admin.site.register(Author) 
admin.site.register(Book, BookAdmin) 
+1

如果你在admin.py中使用上面的代碼,你會在過濾選擇器旁邊得到一個小小的「+」按鈕。您可以單擊它並添加「新作者」,一次添加一個,然後在添加時自行進行過濾。 – Prateek 2011-02-03 13:34:07

+0

你的解決方案是很好的解決方案,但是你有一個錯誤:`class Book`應該是`class BookAdmin`。此外,您不需要指定模型(`model = Book`)。 – Etienne 2011-02-03 15:42:11

7

試試這個:

class AuthorInline(admin.TabularInline): 

    model = Book.authors.through 
    verbose_name = u"Author" 
    verbose_name_plural = u"Authors" 


class BookAdmin(admin.ModelAdmin): 

    exclude = ("authors",) 
    inlines = (
     AuthorInline, 
    ) 

您可能需要添加raw_id_fields = ("author",)AuthorInline如果你有很多的作者。