在dictionnary模板django中的嵌套循环

时间:2015-11-12 12:32:00

标签: python django templates

在我的view.py中,我的上下文如下所示:

  context = {'books': books, 'asked_author': asked_author, 'role':  role_field_list}

books是一个字典列表(书籍列表),对于每本书,它存在一个或多个键,其密钥由role_field_list中的名称命名:

我尝试执行此模板:

{% for book in books %}
    {% for name in role %}
    <h1>{{name}}</h1>
        {% for authors in book.name %}
            {{ authors.lastname }} {{authors.firstname}}
        {% endfor %}
    {% endfor %}
{% endfor %}

但是book.name没有用。 它将名称视为一个“名称”,而不是变量......

感谢您的帮助。

要获得有关我的上下文字典的“字段”和“类型”的更多详细信息,请参阅我的view.py:

def booksAuthor(request, author):
    books_role = AuthorRoleBook.objects.filter(author_book=author).values() # get all the books written by one author
    asked_author = AuthorBook.objects.get(pk=author) # get lastname and firstname for the author selected
    books=[]
    for book_role in books_role:
        book = Book.objects.get(pk=book_role['book_id'])
        book_dict = model_to_dict(book)
        authors_role =  AuthorRoleBook.objects.filter(book_id=book).values() # Get id of the different contributor for each book
        role_field_list = ['auteur', 'traducteur', 'editeur_scientifique', 'directeur_publication']
        for name in role_field_list:
            list_author=[]
            for author_role in authors_role:
                if author_role['role_id']==name:
                     author=AuthorBook.objects.get(pk=author_role['author_book_id'])
                     author_dict = model_to_dict(author)
                     list_author.append(author_dict)
                else:
                    pass
            book_dict[name]=list_author
        books.append(book_dict)
        print(book_dict)
        context = {'books': books, 'asked_author': asked_author, 'role': role_field_list}
    return render(request, 'books_author.html', context)

对于我的模型,也许这不是更简单的方法,但这是:

class AuthorRoleBook(models.Model):
     author_book = models.ForeignKey(AuthorBook)
     role = models.ForeignKey('Role')
     book = models.ForeignKey('Book')

class AuthorBook(models.Model):
    lastname = models.CharField(max_length=100, blank=True, null=True)
    firstname = models.CharField(max_length=100, blank=True, null=True)
    .... ....
    unique_together = (('lastname', 'firstname'),)

class Role(models.Model):
    id = models.CharField(primary_key=True, max_length=100)

class Book(models.Model):
    titre = models.TextField(blank=True, null=True)
     .......  ....   ...
    isbn_electronique = models.CharField(max_length=250, blank=True, null=True)

提前谢谢。

1 个答案:

答案 0 :(得分:0)

对我而言,它现在正在运作。我保持相同的views.py但在我的模板中我这样做:

{% for book in books %}
    <h4>{{ book.titre }}</h4>
    {% if book.directeur_publication %}
        Directeur Publication:
        {% for name in book.directeur_publication %}
            {{ name.lastname }} {{name.firstname}}
        {% endfor %}
     {% endif %}
     {% if book.editeur_scientifique %} ....

... .....等

对于role_field_list中的每个值([&#39; auteur&#39;,&#39; traducteur&#39;,&#39; editeur_scientifique&#39;,&#39; directeur_publication&#39;])我把在&#34; if条件&#34;。

中手动设置我的模板的值

这不是一个美丽的方式......但它正在发挥作用。一定要使用模型对象而不是字典会更好。 感谢您的回答,但如果您有聪明的代码或想法,那么......