在Django listview中显示模型字段名称

时间:2018-10-01 15:05:36

标签: python django listview django-models

在我的列表视图中,我想显示两个模型中包含多对多字段的多个字段。 我可以从一个表中显示正确的值,但是然后我无法使用多对多字段访问另一表。

Models.py

class Books(models.Model):
    title = models.CharField(max_length=100)

class Author(models.Model):

    book = models.ManyToManyField(Books)
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=200)

Views.py

class BooksListView(ListView):
    context_object_name = 'booklist'
    model = Author 
    template_name = 'Books/books_list.html'

Book_list.html

{% for books in booklist %}
    <h5><li class="list-group-item list-group-item-light"">
    {{books.book.all}}:{{books.first_name}} {{books.last_name}}</li></h5>
{% endfor %}

名字和姓氏正确显示,但是books.book.all()我知道这是错误的查询)返回包含标题(这是我需要的标题)的查询集,但其格式为{{1} }。但books.book.title似乎不起作用,我要显示的是“ booktitle-firstname lastname”,并且由于我使用的是两个表,因此我需要一个多对多的关系。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

多对多关系是双向的,因此您无需将所有内容都围绕作者。

class BooksListView(ListView):
    context_object_name = 'booklist'
    model = Book 
    template_name = 'Books/books_list.html'

和模板:

{% for books in booklist %}
    <li class="list-group-item list-group-item-light">
        <h5>{{ book.title }}</h5>
        <p>
        {% for author in book.author_set.all %}
        {{ author.first_name }} {{ author.last_name }}{% if not forloop.last %}, {% endif %}
        {% endfor %}
        </p>
    </li>
{% endfor %}

注意:

  • 默认情况下,related_name{{ModelName}}_set(在这种情况下为author_set)。如果您想要更自然的东西,可以设置related_name='authors'
  • 列表中的每本书都会对数据库进行查询,这对于很多数据来说可能很慢,因此请查看prefetch_related()