在我的html文件中,以下原因导致错误-错误状态无法解析其余部分:'project.expenses.all()'中的'()':
{% for expense in project.expenses.all() %}
<h1>{{ expense.title}}</h1>
{% endfor %}
当我使用以下代码时,一切运行正常:
{% for expense in project.expenses.all %}
<h1>{{ expense.title}}</h1>
{% endfor %}
如果有助于回答这个问题,这是我的models.py文件:
class Project(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(max_length=100, unique=True, blank=True)
budget = models.IntegerField()
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Project, self).save(*args, **kwargs)
class Category(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
class Expense(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='expenses')
title = models.CharField(max_length=100)
amount = models.DecimalField(max_digits=8, decimal_places=2)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
这是views.py:
from django.views.generic.detail import DetailView
from .models import Project
#Create your views here.
class ProjectDetailView(DetailView):
model = Project
slug_url_kwarg = "project_slug"
template_name = 'budget/project_detail.html'
context_object_name = "project"
答案 0 :(得分:2)
Django模板具有特殊的语法。这样做的一部分是为了防止人们在模板中编写业务逻辑。例如,调用带有参数的函数并不简单。可以使用各种“ 技巧”来执行此操作,例如自定义模板标签,自定义模板过滤器等。但是这样做的目的是不鼓励这样做,并将这种逻辑移到视图本身。 >
如果您写一个变量,那么Django将通过查看上下文中是否存在具有该名称的变量来解析该变量,对于带点的序列,它将查找具有该名称的属性,元素等。解决“链”。
如果这些元素之一是可调用的,则Django模板引擎将按照documentation中的说明调用这些元素:
如果变量解析为 callable ,则模板系统将不带参数调用,并使用其结果而不是callable。
Jinja,另一种模板引擎,但是允许一个人编写Python样式的表达式。例如,在Jinja中,可以写:
<!-- Not in Django templates, but in Jinja templates -->
{{ foo.bar(qux) }}