所以我用Django写了一个小的购物清单应用程序。用户可以输入他们想要的物品,这些物品存储在数据库中,与他们所在的类别一起,使呈现给用户的列表更清晰,并给他们(用户)一个很好的概述,他们将购买什么。目标是向用户显示已分类的列表,如下所示:
蔬菜不同
- 卫生纸
等等。我在我的数据库中保存了五个类别,用户可以选择一个相应的类别,一旦他们将一个项目添加到列表中,该项目将显示在列表中。
这些是我的数据库模型:
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=20)
tag = models.CharField(max_length=2)
def __str__(self):
return self.name
class Item(models.Model):
text = models.CharField(max_length=40)
count = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
complete = models.BooleanField(default=False)
def __str__(self):
return self.text
this is my views.py
def items(request):
item_list = Item.objects.order_by('id')
categories = Category.objects.all()
form = ItemForm()
context = {'item_list' : item_list, 'form' : form, 'categories' : categories}
return render(request, 'buyit/index.html', context)
这是我的index.html(非常基本,剥离了所有的CSS和HTML的东西):
{% for category in categories %}
<h4>{{ category.name }}</h4>
{% for item in category.item_set.all() %}
{{ item.text }}
{% endfor %}
{% endfor %}
我从一个代码片段的Jinja2模板得到了这个函数,它可能是,我没有正确理解它。但是,调试器告诉我:
TemplateSyntaxError at /
Could not parse the remainder: '()' from 'category.item_set.all()'
任何提示我做错了什么?简单地显示类别工作得很好,但在添加
之后{% for item in category.item_set.all() %}
{{ item.text }}
{% endfor %}
坠毁。任何帮助都非常感谢!
提前感谢!
你不能在django模板中使用()
。只需删除它们以调用函数/方法。
从https://docs.djangoproject.com/en/3.1/ref/templates/language/
#变量幕后从技术上讲,当模板系统遇到点时,它会按照以下顺序进行查找:
- 字典查找
- 属性或方法查找
- 数字索引查找
如果结果值是可调用的,则不带参数调用它。调用的结果成为模板值。
try this:
views.py:
def items(request):
commoditys = {category: Item.objects.filter(category=category) for category in Category.objects.all()}
form = ItemForm()
context = {'commoditys' : commoditys, 'form' : form}
return render(request, 'buyit/index.html', context)
index . html:
{% for category, commoditys in commoditys.items %}
<h3>{{ category.name }}</h3>
{% for commodity in commoditys %}
{{ commodity.text }}
{% endfor %}
{% endfor %}
将Category变量更改为字典,其中每个条目的Key为Category对象,其对应的值为它所属的条目Queryset