如何在Django管理站点上启用内联多个字段?
假设我有书和作者模型如何在Django管理站点上启用内联多个字段?,django,django-models,django-admin,Django,Django Models,Django Admin,假设我有书和作者模型 class Author(models.Model): name = CharField(max_length=100) class Book(models.Model): title = CharField(max_length=250) authors = ManyToManyField(Author) 我希望每本书都有多个作者,在Django管理网站上,我希望能够从一本书的编辑页面一次性向一本书添加多个新作者。我不需要向作者添加书籍 这可能
class Author(models.Model):
name = CharField(max_length=100)
class Book(models.Model):
title = CharField(max_length=250)
authors = ManyToManyField(Author)
我希望每本书都有多个作者,在Django管理网站上,我希望能够从一本书的编辑页面一次性向一本书添加多个新作者。我不需要向作者添加书籍
这可能吗?如果是这样的话,实现它的最佳和/或最简单的方法是什么?好吧,请查看。如果我没有弄错的话,做你想做的事情非常简单: 您应该在应用程序目录中创建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)
试试这个:
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\u id\u fields=(“author”,)
添加到AuthorInline
。如果您在admin.py中使用上述代码,您将在筛选选择器旁边看到一个小“+”按钮。您可以单击它并添加“新作者”,一次添加一个,添加时会自动转到筛选侧。您的解决方案是好的,但您有一个错误:类书
应该是类书管理员
。此外,您不需要指定模型(model=Book
)。@Etienne:显式优于隐式~Python的禅宗-蒂姆·彼得斯(PEP 20)很抱歉在BookAdmin上错过了。更正。@Prateek:简单比复杂好。最好删除model=Book,因为这是不必要的,并且会引起混乱。如果定义了interdiary模型,Django不会为多对多模型字段添加表单字段。谢谢!我很高兴找到这个古老的答案。如果你还在,你能解释一下raw\u id\u fields
是如何与“author”一起工作的吗?没有一个模型中声明具有该名称的字段。它指的是哪个值?我有点预感,“author”会从Book.authors.表中的author\u id列中获取值。通过这类似于app\u Book\u authors
(app
代表应用标签)。允许您在文本字段中指定ID,而不是使用select元素选择相关记录。当相关表中有很多记录时,这是有意义的。提高绩效。