2011-02-03 26 views
12

Giả sử tôi có các mẫu Sách và Tác giả.Làm cách nào để kích hoạt ManyToManyFields nội tuyến trên trang web quản trị Django của tôi?

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

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

Tôi muốn mỗi cuốn sách có nhiều tác giả và trên trang web quản trị Django tôi muốn có thể thêm nhiều tác giả mới vào một cuốn sách từ trang Chỉnh sửa của nó, trong một lần. Tôi không cần phải thêm Sách vào tác giả.

Điều này có khả thi không? Nếu vậy, cách tốt nhất và/hoặc cách dễ nhất để hoàn thành nó là gì?

Trả lời

16

Nó là khá đơn giản để làm những gì bạn muốn, Nếu tôi nhận bạn một cách chính xác:

Bạn nên tạo một file admin.py bên trong thư mục ứng dụng của bạn và sau đó viết đoạn mã sau:

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

Nếu bạn sử dụng mã trên trong admin.py, bạn sẽ nhận được nút "+" nhỏ bên cạnh bộ chọn lọc. Bạn có thể nhấp vào nó và thêm "tác giả mới", mỗi lần một tác phẩm sẽ tự chuyển sang bên được lọc. – Prateek

+0

Giải pháp của bạn là tốt nhất nhưng bạn có một lỗi trong đó: 'class Book' nên là' class BookAdmin'. Ngoài ra, bạn không cần phải chỉ định mô hình ('model = Book'). – Etienne

+2

@Etienne: Rõ ràng là tốt hơn là ẩn. ~ Zen of Python - Tim Peters (PEP 20) xin lỗi về việc thiếu trên BookAdmin. Đã sửa. – Prateek

7

Hãy thử điều này:

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, 
    ) 

bạn có thể cần phải thêm raw_id_fields = ("author",) để AuthorInline nếu bạn có nhiều tác giả.

+0

EXCELLENT !!! CẢM ƠN BẠN! –

+0

Cảm ơn bạn! Tôi rất vui khi tìm thấy câu trả lời cũ này. Nếu bạn vẫn ở xung quanh, bạn có thể giải thích cách 'raw_id_fields' hoạt động với **" author "** không? Trường có tên đó không được khai báo trong không có mô hình nào. Nó tham chiếu đến giá trị nào? – cezar

+0

Tôi có một số linh cảm, ** "tác giả" ** sẽ nhận được giá trị từ cột ** author_id ** trong bảng cho 'Book.authors.through' sẽ giống như' app_book_authors' ('app' là viết tắt của ở đây cho nhãn ứng dụng). – cezar

Các vấn đề liên quan