如何访问Django中基于类的视图中的多对多字段?

Pin*_*ani 2 python django many-to-many django-class-based-views

我在models.py中有两个模型,作者和书

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()
    age = models.IntegerField()

def __str__(self):
    return '%s %s' %(self.first_name, self.last_name)

def __unicode__(self):
    return '%s %s' %(self.first_name, self.last_name)



class Book(models.Model):
    title = models.CharField(max_length=100) #name = title
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    rating = models.FloatField()
    author = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

def __str__(self):
    return self.title

def __unicode__(self):
    return self.title
Run Code Online (Sandbox Code Playgroud)

现在我使用ListView列出所有书籍.点击一本书,我正在使用以下方法获取该书的信息

class BookDetailView(generic.DetailView):
    template_name = 'books/book_detail1.html'
    model = Book
    context_object_name = 'book_detail' 
Run Code Online (Sandbox Code Playgroud)

我可以访问标题,页面,价格,评级,发布者和publication_date,但不能获取所有作者(作者列表).虽然我打算简单地打印它,但它在模板中打印无.我甚至尝试使用For循环迭代但不在模板中完成

views.py

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<ul>
    <li>Price:{{ book_detail.price }}</li>  
    <li>Pub Date:{{ book_detail.publication_date }}</li>
    <li>Title: {{ book_detail.title }}</li>
    <li>Pages: {{ book_detail.pages }}</li> 
    <li>Rating: {{ book_detail.rating }}</li>
    <li>Publisher: {{ book_detail.publisher }}</li>
    <li>Author: {{ book_detail.author }}</li>   
</ul>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?

sol*_*oke 8

您已经定义了多对多关系Book,Author这意味着一本书可以拥有任意数量的作者.为了显示它们,您需要遍历作者集:

Authors:
<ul>
{% for author in book_detail.author.all %}
    <li>{{ author }}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

您可能希望更改该字段的名称authors以减少混淆.

或者,如果您只想要一本书的作者,那么您需要使用a ForeignKey而不是a ManyToManyField.在这种情况下,您现有的模板逻辑将起作用.