Передача вычисленного значения в шаблон Django - PullRequest
1 голос
/ 11 января 2020

Я довольно новичок в Django и у меня проблемы с передачей переменной в шаблон Django. Мой код находит среднее значение поля Integer из базы данных (используя AVG Django), а затем вычисляет результат. В конечном итоге я хотел бы передать результат этого вычисления в шаблон.

Мой model.py:

from django.db import models

class Post(models.Model):
    fname = models.CharField(max_length=20)
    lname= models.CharField(max_length=25)
    reading=models.IntegerField(default=100)
    entrytime=models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self

Представление:

from django.views.generic import TemplateView, ListView
from django.db.models import Avg
from .models import Post

class ShowCalcView(ListView):
    model=Post
    template_name = 'calc.html'

    def calca1c(request):

        context = Post.objects.aggregate(Avg('reading'))
        r=context['reading__avg']
        rs = (46.7 + r) / 28.7
        context['calc']  = rs
        return context

шаблон:

<h1>Approximate A1C</h1>

<p>Approximate A1c:  {{ calc }}</p>

Я пытался использовать {{cal c}}, {{cal c .rs}}, {{calc ['rs']}} и почти любая другая комбинация, о которой я могу думать, но значение не передается. Я проверил функцию в оболочке, и она дает желаемый результат. Возможно, я упускаю что-то очевидное, но не могу понять.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 11 января 2020

Контекст для представления генерируется методом get_context_data(). Это то, что вам нужно переопределить, чтобы добавить дополнительный контекст в представление. Поскольку в настоящее время ваш getca1c() метод никогда не будет использован, потому что Django его не ищет.

Таким образом, вы бы сделали что-то вроде этого:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['calc'] = self.getca1c(self)
    return context

Затем вы измените getca1c(), чтобы получить только число, которое является средним значением, которое вы хотите отобразить:

def calca1c(self):
    result = Post.objects.aggregate(Avg('reading'))
    r = result ['reading__avg']
    return (46.7 + r) / 28.7

(примечание: первый аргумент этого метода - self, т. Е. Экземпляр класса представления, а не объект запроса).

А затем в вашем шаблоне:

<p>Approximate A1c:  {{ calc }}</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...