Как использовать методы модели в шаблонах Django с представлением на основе классов - PullRequest
0 голосов
/ 31 октября 2019

Я определил методы в своей модели, и я пытаюсь использовать его в шаблоне django, который отображается с использованием ListView

Моя модель выглядит следующим образом:

class Book(models.Model):
  name = models.CharField(max_length=32)
  price = models.IntegerField()
  created_at = models.DateTimeField(auto_now_add=True)
  user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

  def get_total_sum(self):
        return super().objects.all().filter(user=self.user).aggregate(models.Sum('price'))

Мой взгляд:

from django.views.generic.list import ListView

from book.models import Book

class BookView(ListView):
  template_name = 'book.html'

  # I'm using this to order book by created date
  def get_queryset(self):
    return Book.objects.filter(user=self.request.user).order_by('-created_at')

И мой шаблон:

Total books: {{ object_list|length }}
Total price of all books: # I've no idea how to display them here, when using class based view

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Если вы хотите использовать Book.get_total_sum в шаблоне, вам нужно сделать его свойством.

  @property
  def get_total_sum(self):
      return super().objects.all().filter(user=self.user).aggregate(models.Sum('price'))

в шаблоне

{{ book.get_total_sum }}

Другой способ - ввестизначение, которое вы хотите, получив его с кодом Python в методе view get_context и вставив его в контекст. Для вычисленного значения, которое отличается для каждого экземпляра Book, это, очевидно, не работает, и свойство является идеальным. Пользовательские теги шаблонов идеально подходят, когда код не привязан к одному классу как свойство

0 голосов
/ 31 октября 2019

Одна вещь, которую вы можете сделать, это использовать пользовательские templatetags:

Выполните следующие действия:

  1. Создайте папку templatetags в каталоге вашего приложения
  2. Создайте файл внутри, например book_filter.py и __init__.py
  3. Внутри book_filter.py Скопируйте ниже фильтра.

book_filter.py

from django import template
egister = template.Library()

@register.filter
def total_price(amounts):
    total = 0
    for amount in amounts:
        total += amount.price
    return total

Сейчас вhtml-файл, выполните следующие действия:

{% load book_filter %}

Total price of all books: {{object_list|total_price}}

Используйте эту ссылку для справки: custom-template-tags

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...