2015-07-12 35 views
0

我对django和python都很陌生。如何在Django模板中显示两个列表?

这在示例代码我提出了,说明我的问题:

模型

class Book(models.Model): 
    submitted_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='book_subby') 
    submitted_date = models.DateField(auto_now=True) 
    book_title = models.CharField(max_length=200) 
    book_publisher = models.ForeignKey(Publishers) 


class Publishers(models.Model): 
    submitted_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='publisher_subby') 
    submitted_date = models.DateField(auto_now=True) 
    book_publisher = models.CharField(max_length=200) 

查看

def book_list(request): 
    books = Book.objects.filter(submitted_by=request.user, submitted_date__lte=timezone.now()).order_by('submitted_date') 
    books_by_publisher = 
    return render(request, 'book/list_books.html', { 
     'books': books 
     }) 

模板list_books.html

{% for book in books %} 
    <ul> {{ book.book_publisher }} 
    <li> {{book.book_title }} </li> 
{% endfor %} 

这显示:

发布商X
*教科书
出版商ý
*书B
发布商X
*预订Ç
出版商ý
*书d

我想显示:
出版商X
*书A
*书ç

出版商Ÿ
*书B
*图书d

我尝试做多为模板的循环,但不能使它工作。 如果有人能在正确的方向上推动我如何解决这个问题,我将不胜感激。 谢谢,安德烈

+1

作为第一步,您将不得不按照服务器端的发布者对您的图书进行分组。 –

+0

是的,我一直在想办法在视图中这样做。任何提示将我推向正确的方向? – Andreas

+0

见下文。您想在服务器上进行分组:) –

回答

0

你可以做这样的事情:

模型

class Book(models.Model): 
    submitted_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='book_subby') 
    submitted_date = models.DateField(auto_now=True) 
    book_title = models.CharField(max_length=200) 
    book_publisher = models.ForeignKey(Publishers, related_name='books') 

    class Meta: 
     ordering = ['submitted_date'] # To keep this sorted by this field 

查看

def book_list(request): 
    publishers_with_books = Publishers.objects.prefetch_related('books').filter(submitted_by=request.user, books__isnull=False, books__submitted_date__lte=timezone.now()) 
    return render(request, 'book/list_books.html', { 
     'publishers': publishers_with_books 
     }) 

模板list_books.html

{% for publisher in publishers %} 
    <ul> {{ book.book_publisher }} 
     {% for book in publisher.books.all %} 
      <li> {{book.book_title }} </li> 
     {% endfor %} 
    </ul> 
{% endfor %} 

希望这对你有帮助;)。

+0

由于它完成了这项工作,'publisher.books.all'会触发每个发布者的数据库,如果发布者的总数相当高,则可能导致严重的性能问题。 – ozgur

+0

这只是一个解决方案,这当然可以改进@ozgur。 –