Передача Django Queryset в представлениях к шаблону

87
2

У меня есть Django Views, который имеет некоторую логику передачи правильной категории в шаблон.

class ProductListView(ListView):
model = models.Product
template_name = "catalogue/catalogue.html"

def get_queryset(self):
category = self.kwargs.get("category")
if category:
queryset = Product.objects.filter(category__iexact=category)
else:
queryset = Product.objects.all()
return queryset

Я не могу понять, как передать это шаблону, мой код шаблона выглядит так:

            {% for product in products %}
<tr>
<td><h5>{{ product.name }}</h5>
<p>Cooked with chicken and mutton cumin spices</p></td>
<td><p><strong>£ {{ product.price }}</strong></p></td>
<td class="options"><a href="#0"><i class="icon_plus_alt2"></i></a></td>
</tr>
{% endfor %}

Я уверен, что мой синтаксис шаблона неверен, но как передать конкретную категорию шаблону? Поэтому, если у меня есть категория под названием "Сеть", как передать все продукты для сети в шаблон.

спросил(а) 2021-01-25T20:08:40+03:00 4 месяца, 2 недели назад
1
Решение
63

Элементы из object_list в ListView доступны как object_list в шаблоне, поэтому вам нужно сделать что-то вроде:

{% for product in object_list %}
<tr>
<td><h5>{{ product.name }}</h5>
<p>Cooked with chicken and mutton cumin spices</p></td>
<td><p><strong>£ {{ product.price }}</strong></p></td>
<td class="options"><a href="#0"><i class="icon_plus_alt2"></i></a></td>
</tr>
{% endfor %}

Подробности можно найти в документации ListView. Обратите внимание на метод get_context_data - он возвращает словарь переменных и значений, который будет передан шаблонам. Вы всегда можете найти, почему он работает таким образом в исходном коде.

ответил(а) 2021-01-25T20:08:40+03:00 4 месяца, 2 недели назад
62

Вы можете добавить следующий метод

def get_context_data(self, **kwargs):
context = super(ProductListView, self).get_context_data(**kwargs)
some_data = Product.objects.all()
context.update({'some_data': some_data})
return context

Итак, теперь в вашем шаблоне у вас есть доступ к переменной some_data. Вы также можете добавить столько данных, сколько сможете обновить словарь контекста.

Если вы все еще хотите использовать метод get_queryset, вы можете получить доступ к этому object_list в шаблоне как object_list

{% for product in object_list %}
...
{% endfor %}

ответил(а) 2021-01-25T20:08:40+03:00 4 месяца, 2 недели назад
44

Более элегантный способ передачи данных в контекст шаблона - использовать встроенную переменную вида. Поэтому вместо того, чтобы переопределять метод get_context_data(), вы можете просто создать настраиваемый метод, который возвращает набор запросов:

def stores(self):
return Store.objects.all()

Затем вы можете использовать это в шаблоне:

{% for store in view.stores %}
...
{% endfor %}

Смотрите также:

ответил(а) 2021-01-25T20:08:40+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема