在Django HTML详细信息模板中,为什么.all可以工作,但是.all()给出错误?

时间:2019-01-20 00:28:13

标签: django django-models django-views jinja2

在我的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"

1 个答案:

答案 0 :(得分:2)

Django模板具有特殊的语法。这样做的一部分是为了防止人们在模板中编写业务逻辑。例如,调用带有参数的函数并不简单。可以使用各种“ 技巧”来执行此操作,例如自定义模板标签,自定义模板过滤器等。但是这样做的目的是不鼓励这样做,并将这种逻辑移到视图本身。 >

如果您写一个变量,那么Django将通过查看上下文中是否存在具有该名称的变量来解析该变量,对于带点的序列,它将查找具有该名称的属性,元素等。解决“链”。

如果这些元素之一是可调用的,则Django模板引擎将按照documentation中的说明调用这些元素:

  

如果变量解析为 callable ,则模板系统将不带参数调用,并使用其结果而不是callable。

Jinja,另一种模板引擎,但是允许一个人编写Python样式的表达式。例如,在Jinja中,可以写:

<!-- Not in Django templates, but in Jinja templates -->
{{ foo.bar(qux) }}