2012-02-08 2 views
0

Я пытаюсь отобразить данные из нескольких моделей (внешний ключ) в виде табличного формата.Список данных из нескольких моделей в плоской таблице в Django

class Author(models.Model): 
    name = models.CharField(max_length=250) 

class Book(models.Model): 
    title = models.CharField(max_length=250) 
    isbn = models.CharField(max_length=250) 
    author = models.ManyToManyField(Author) 

Ожидаемый результат:

  • Книга 1 - isbn1 - Author1
  • Книга 1 - isbn1 - Author2
  • Книга 2 - isbn2 - Author3
  • Книга 3 - isbn3 - Автор1

Теперь я могу запросить две модели с использованием различных фильтров и иметь соответствующие объекты списка. Как я могу отобразить эти два объекта списка в шаблоне с меньшим количеством кода?

Один из способов, которым я могу думать, - это перебрать эти два списка и создать список dict с соответствующими ключами для столбцов и передать этот список в шаблон. Есть ли лучший подход к этому?

Текущий код

def getresult(params): 
    print "printing dict ", params 
    titles = params.getlist('titles') 
    authors_input = params.getlist('authors') 
    ... 
    books = Book.objects.all() 
    if len(title) > 0 : 
     books = books.objects.filter(title__in = titles) 
    ... 
    authors = Authors.objects.filter(name__in=books) 
    if len(authors_input) > 0 : 
     authors = authors.filter(name__in = authors_input) 
    result = [] 
    for book in books: 
     authors = authors.filter(name=book.author) 
     for author in authors: 
      output_item = {} 
      output_item['book_name'] = book.title 
      output_item['isbn'] = book.isbn 
      output_item['author'] = author.name 
      result.append(output_item) 
    return result 
+0

Покажите нам ваш текущий код. – Marcin

+0

@ Марцин текущий код – butters

ответ

1

Поскольку это общая закономерность, есть generic view, который заботится об этом. Ниже приведены фрагменты кода из документации, измененной для вашего уникального случая.

urls.py:

from django.conf.urls.defaults import * 
from django.views.generic import ListView 
from myapp.models import Book 

urlpatterns = patterns('', 
    (r'^books/$', ListView.as_view(
     model=Book, 
    )), 
) 

Создать шаблон под названием book_list.html в директории под названием myapp где-то в месте, которое находится в вашем TEMPLATE_DIRS.

Этот фрагмент кода в шаблоне (book_list.html) делает то, что вам нужно:

<ul> 
{% for book in object_list %} 
    {% for author in book.author_set.all %} 
    <li>{{ book.title }}&mdash;{{ book.isbn }}&mdash;{{ author.name }}</li> 
    {% endfor %} 
{% endfor %} 
</ul> 
+0

Могу ли я фильтровать объекты книги и автора на основе условий моего фильтра? – butters

+0

Да. Прочитайте [документацию] (https://docs.djangoproject.com/en/1.3/topics/class-based-views/#generic-views-of-objects) на общих представлениях. –