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