в django html подробно шаблон почему .all работает, но .all () выдает ошибку? - PullRequest
0 голосов
/ 20 января 2019

В моем html-файле следующее вызывает ошибку - состояния ошибки Не удалось проанализировать остаток: '()' from '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 голосов
/ 20 января 2019

Шаблоны Django имеют специальный синтаксис.Это частично сделано для того, чтобы люди не могли писать бизнес-логика в шаблонах.Например, не просто вызвать функцию с аргументами.Для этого можно использовать всевозможные « трюки », такие как настраиваемые теги шаблонов, настраиваемые фильтры шаблонов и т. Д. Но идея состоит в том, чтобы отговорить это и перенести такую ​​логику в само представление.

Если вы напишите переменную, то Django разрешит эту переменную, посмотрев, есть ли переменная с этим именем в контексте, и для последовательности с точками, он будет искать атрибуты, элементы и т. Д. С этим именем вразрешите "цепочку".

Если один из этих элементов может быть вызван, механизм шаблонов Django вызовет их, как написано в документации :

Если переменная преобразуется в вызываемый , система шаблонов вызовет ее без аргументов и будет использовать ее результат вместо вызываемого.

Jinja , еще один шаблонизатор, позволяет писать выражения в стиле Python.Например, в дзиндзя можно написать:

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