Python 如何在视图中获取注释变量以在django模板上显示数据?

Python 如何在视图中获取注释变量以在django模板上显示数据?,python,django,django-models,Python,Django,Django Models,当我加载pastry_list.html页面时,如何让annotate在django模板上显示数据?我在views.py中将一个变量设置为注释行。我在模板中的变量中运行了一个for循环。我是错过了什么还是做错了什么?出于某种原因,模板似乎无法识别views.py变量。谢谢 from django.db import models from django.utils import timezone from django.urls import reverse from collectio

当我加载pastry_list.html页面时,如何让annotate在django模板上显示数据?我在views.py中将一个变量设置为注释行。我在模板中的变量中运行了一个for循环。我是错过了什么还是做错了什么?出于某种原因,模板似乎无法识别views.py变量。谢谢

 from django.db import models
 from django.utils import timezone
 from django.urls import reverse
 from collections import OrderedDict

class IntegerRangeField(models.IntegerField):
def __init__(self, verbose_name=None, name=None, min_value=None, 
max_value=None, **kwargs):
    self.min_value, self.max_value = min_value, max_value
    models.IntegerField.__init__(self, verbose_name, name, **kwargs)
def formfield(self, **kwargs):
    defaults = {'min_value': self.min_value, 
'max_value':self.max_value}
    defaults.update(kwargs)
    return super(IntegerRangeField, self).formfield(**defaults)

class Pastry(models.Model):
CHOICES_DICT = OrderedDict((
    ("Muffin", "Muffin"),
    ("Cupcake", "Cupcake"),
    ("Brownie", "Brownie"),
    ("Cake", "Cake"),
    ("Fruit Tart", "Fruit Tart")
))
pastry = models.CharField(max_length=20, default="muffin",   
choices=CHOICES_DICT.items())
vote = IntegerRangeField(default=1, min_value=1, max_value=1)

def get_absolute_url(self):
    return reverse("pastry_detail", kwargs={'pk': self.pk})

def __str__(self):
    return self.pastry


VIEWS.PY
from django.shortcuts import render
from django.views.generic import (TemplateView,ListView,
                              DetailView,CreateView,
                              UpdateView,DeleteView)
from django.urls import reverse_lazy
from myapp.models import Pastry
from myapp.forms import PastryForm
from django.db.models import F


ps = Pastry.objects.values('pastry').annotate(total=Count('pastry'))

class PollsListView(ListView):
model = Pastry

def get_queryset(self):
    return Pastry.objects.all()

class PollsDetailView(DetailView):
model = Pastry

class PollsCreateView(CreateView):
success_url = reverse_lazy('pastry_list')
form_class = PastryForm
model = Pastry

class PollsUpdateView(UpdateView):
success_url = reverse_lazy('pastry_list')
form_class = PastryForm
model = Pastry


class PollsDeleteView(DeleteView):
model = Pastry
success_url = reverse_lazy('pastry_list')

pastry_list.html  (template) 
{% extends "base.html" %}
{% block content %}
<div class="jumbotron">

<a href="{% url 'pastry_new' %}">New Poll</a>
<h1>Voting for the favorite pastry</h1>

{% for p in ps %}
 {% for k, v in p.items %}
   {{v}}
 {% endfor %}
{% endfor %}

{% for pastry in pastry_list %}
    <div class="pastry">
        <h3><a href="{% url 'pastry_detail' pk=pastry.pk %}">
  {{ pastry.pastry }}</a></h3>
    </div>
  {% endfor %}

 </div>

  {% endblock %}


FORMS.PY
from django import forms
from myapp.models import Pastry
from django.forms import ModelForm

class PastryForm(ModelForm):

class Meta():
    model = Pastry
    fields = ['pastry', 'vote']

 PASTRY_FORM.HTML
 {% extends "base.html" %}
 {% load widget_tweaks %}
 {% block content %}
 <div class="jumbotron">
 <h1>New Poll</h1>
 <form class="post-form" method="POST">
 {% csrf_token %}
 {{ form.as_p }}
 <button type="submit" class="save btn btn-default">Save</button>
 </form>
 </div>
 {% endblock %}
 </body>
 </html>
来自django.db导入模型的

从django.utils导入时区
从django.url反向导入
从集合导入订单
类IntegerRangeField(models.IntegerField):
定义初始化(self,verbose\u name=None,name=None,min\u value=None,
最大值=无,**kwargs):
self.min\u值,self.max\u值=最小值,最大值
models.IntegerField.\uuuuu init\uuuuuu(self,verbose\u name,name,**kwargs)
def表单字段(自身,**kwargs):
默认值={'min_值]:self.min_值,
“最大值”:self.max\u value}
默认值。更新(kwargs)
返回super(IntegerRangeField,self).formfield(**默认值)
类糕点(models.Model):
选项\u DICT=OrderedDict((
(“松饼”、“松饼”),
(“纸杯蛋糕”、“纸杯蛋糕”),
(“布朗尼”、“布朗尼”),
(“蛋糕”、“蛋糕”),
(“水果馅饼”、“水果馅饼”)
))
pastry=models.CharField(最大长度=20,默认值=“muffin”,
选项=选项\u DICT.items())
投票=整数字段(默认值=1,最小值=1,最大值=1)
def get_绝对_url(自身):
返回反面(“糕点细节”,kwargs={'pk':self.pk})
定义(自我):
返回自我糕点
VIEWS.PY
从django.shortcuts导入渲染
从django.views.generic导入(TemplateView、ListView、,
DetailView,CreateView,
更新视图、删除视图)
从django.url导入反向链接
从myapp.models导入糕点
从myapp.forms导入PastryForm
从django.db.models导入F
ps=Pastry.objects.values('Pastry')。注释(total=Count('Pastry'))
类PollsListView(ListView):
模型=糕点
def get_queryset(自我):
return Pastry.objects.all()
类PollsDetailView(详细视图):
模型=糕点
类PollsCreateView(CreateView):
success\u url=reverse\u lazy(“糕点清单”)
形式=糕点形式
模型=糕点
类PollsUpdateView(更新视图):
success\u url=reverse\u lazy(“糕点清单”)
形式=糕点形式
模型=糕点
类PollsDeleteView(DeleteView):
模型=糕点
success\u url=reverse\u lazy(“糕点清单”)
pastry_list.html(模板)
{%extends“base.html”%}
{%block content%}
投票选最喜欢的糕点
{ps%中p的%s}
{p.items%中k,v的百分比}
{{v}
{%endfor%}
{%endfor%}
{糕点列表中的糕点百分比%}
{%endfor%}
{%endblock%}
FORMS.PY
来自django导入表单
从myapp.models导入糕点
从django.forms导入ModelForm
类糕点形状(模型形状):
类Meta():
模型=糕点
字段=['糕点','投票']
糕点表单.HTML
{%extends“base.html”%}
{%load widget_tweaks%}
{%block content%}
新投票
{%csrf_令牌%}
{{form.as_p}}
拯救
{%endblock%}

就我个人而言,我只会将每次投票记录为一行。然后,您可以使用
注释
总和
对类别及其总数进行分组。例如,作为一个属性方法。我试图将其添加到我的views.py pastrys=Pastry.objects.values('Pastry').aggregate(total=Sum('vote'))中,并将其添加到我的Pastry_list.html模板Muffins:{Pastry in Pastry%}{{Pastry.Pastry}总计:{{Pastry.total}{endfor%}中,但它没有显示任何数据。你能告诉我哪里出错了吗?谢谢你的帮助。非常感谢。我建议您使用
pdb
检查您的VAR,以查看查询集实际返回的内容。确保表中有数据。你可能想用
annotate
而不是
aggregate
。我试过使用pdb,但找不到错误。我把它改成了这个,但还是不起作用。是因为我的领域有选择吗?在views.py中,我只有这一行作为变量ps=Pastry.objects.values('Pastry').annotate(total=Count('Pastry'))在模板中我有以下内容,但它似乎被忽略了。我错过什么了吗?{%p在ps%}{%k在p.items%}{{v}}{%endfor%}{%endfor%}{%endfor%}视图中的注释行确实有正确的数据,但不知何故,我的模板没有检索数据。{‘糕点’:‘布朗尼’,‘总计’:1}{‘糕点’:‘蛋糕’,‘总计’:1}{‘糕点’:‘纸杯蛋糕’,‘总计’:1}{‘糕点’:‘水果馅饼’,‘总计’:1}{‘糕点’:‘松饼’,‘总计’:2}