2015-07-12 2 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
* Книга
Издательство Y
* Книга B
Издательство X
* Книга C
Издатель Y
* Книга D

Я хочу, чтобы отобразить:
Издатель X
* Книга A
* Книга C

Издательство Y
* Книга B
* Книга D

Я попытался сделать мультипликатор для петель в шаблоне, но не мог заставить его работать. Буду признателен, если кто-то может подтолкнуть меня в правильном направлении, как это решить. Спасибо, Andrea

+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. –

Смежные вопросы