Как сделать Queryset в шаблоне таблицы-Django - PullRequest
6 голосов
/ 09 февраля 2012

У меня есть модель, которая определена как показано, которая действует на запрос и получает список объектов, которые должны быть помещены в соответствующие ячейки таблицы.Вот соответствующая часть кода.

class Location(models.Model):
    x=models.IntegerField(null=True)
    y=models.IntegerField(null=True)
    z=models.CharField(max_length=5,null=True)

    def __unicode__(self):
        return self.z

Из этой базы данных я хочу получить все объекты и поместить их в 2d-таблицу со строками и столбцами, определенными x, y этого объекта.не является определенным объектом (x, y), тогда этот конкретный слот должен быть показан пустым в таблице. Это представление, которое я написал для достижения этих целей.

def gettable(request):
    events=[]
    for xdim in xrange(3):
        xe=[]
        for ydim in xrange(3):
            object=[0]
            object.append(Location.objects.filter(x=xdim,y=ydim))
            xe.append(object[-1])
            events.append(xe)
    return render(request, 'scheduler/table.html', {'events':events})

Вот HTML-часть кода

<table border="1">
    <th>Header 0</th>
    <th>Header 1</th>
    <th>Header 2</th>
    {% for event in events %}
    <tr>
    {% for x in event %} <td>{{ x }}</td>
    {% endfor %}
    </tr>
    {% endfor %}
</table>

Мне нужно решить несколько вопросов здесь.

1.Мой код для представлений совсем неизящный (что плохо, так как я знаю, что django предлагает множество вещей для решения таких задач), так как я определяю переменные специально для циклического прохождения, а не беру их из значений (x, y) объектов базы данных.

2.Я получаю вывод в формате [<Location: 21>], но хочу, чтобы он был равен '21'.

3.Как я ввожу пустые ячейки, где не существует какого-либо объекта для данного (x, y).

4.Пожалуйста, предложите любой другой возможный способ, который может сделать мой код более простым и общим.

Ответы [ 3 ]

16 голосов
/ 12 февраля 2012

Если вы хотите сделать ваш код проще, я бы рекомендовал использовать приложение django-tables2 . Этот подход может решить все ваши проблемы с генерацией таблиц.

По документации:

django-tables2 упрощает задачу преобразования наборов данных в HTML столы. Имеет встроенную поддержку разбиения на страницы и сортировки. Это для Таблицы HTML, что django.forms делает для форм HTML. например, * +1008 *

Его функции включают в себя:

  • Источником данных может быть любая итерация, но включена специальная поддержка наборов запросов Django.
  • Встроенный пользовательский интерфейс не использует JavaScript.
  • Поддержка автоматической генерации таблиц на основе модели Django.
  • Поддерживает пользовательские функции столбцов с помощью подклассов.
  • Разбивка.
  • Сортировка таблиц по столбцам.
  • Тег шаблона для включения простого рендеринга в HTML.
  • Общий вид mixin для использования в Django 1.3.

Создать таблицу так же просто, как:

import django_tables2 as tables

class SimpleTable(tables.Table):
    class Meta:
        model = Simple 

Это будет затем использоваться в представлении:

def simple_list(request):
    queryset = Simple.objects.all()
    table = SimpleTable(queryset)
    return render_to_response("simple_list.html", {"table": table},
                              context_instance=RequestContext(request))

И, наконец, в шаблоне:

{% load django_tables2 %} 
{% render_table table %}

Этот пример показывает один из самых простых случаев, но django-tables2 может сделать намного больше! Проверьте документация для более подробной информации.

Можно также использовать словарь вместо набора запросов.

1 голос
/ 09 февраля 2012

Для пункта 2 вы даете каждой ячейке список, а не отдельный объект, {{x.0}} должен дать вам правильное значение, но он также предполагает, что вы подходите к нему неправильно в логике представления.

1 голос
/ 09 февраля 2012

За точку:

  1. ИМО вы можете избежать создания собственного фильтра или тега и использования набора запросов.
  2. Вам необходимо определить __unicode__ (или __string__) метод возврата желаемого элемента.
  3. Если значение пустое или элемент не существует, результат визуализации также будет пустым.

HTH

...