Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django管理站点上启用内联多个字段?_Django_Django Models_Django Admin - Fatal编程技术网

如何在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元素选择相关记录。当相关表中有很多记录时,这是有意义的。提高绩效。