我为我的投资组合项目定义了以下模型:
class Technology(models.Model):
title = models.CharField(max_length=10)
def __str__(self):
return self.title
class Meta:
verbose_name_plural = 'Technologies'
class Project(models.Model):
title = models.CharField(max_length=100)
description = HTMLField()
technology = models.ManyToManyField(Technology)
image = models.ImageField(upload_to='projects/')
def __str__(self):
return self.title
我的views.py
中有这个:
def index(request):
projects = Project.objects.all()
context = {'projects': projects}
return render(request, 'homepage/index.html', context)
以及以下用于显示项目的 HTML 片段:
{% for project in projects %}
<div class="col-lg-4 col-md-6 portfolio-item filter-django">
<div class="portfolio-wrap">
<img src="{% static 'homepage/img/portfolio/portfolio-1.jpg' %}" class="img-fluid">
<div class="portfolio-info">
<h4>{{ project.title }}</h4>
<p>FIRST TECHNOLOGY GOES HERE</p>
</div>
</div>
</div>
{% endfor %}
我的挑战是 <p>...</p>
标签,因为每个项目都有多种技术,但我只需要打印第一个,所以我不能在此处使用 for loop
。
我试过 {{ project.technology.[0] }}
但这给了我 Could not parse the remainder: '[0]' from 'project.technology.[0]'
请帮忙。
答案 0 :(得分:1)
Django 模板语言 (DTL) 不支持 python 支持的各种复杂语法。这是有意完成的,因为 DTL 的目标之一是将业务逻辑与表示逻辑分开。因此 {{ project.technology.[0] }}
不起作用。但是,可以使用 .
运算符本身执行各种查找,这意味着您可以编写 {{ project.technology.all.0 }}
(这里因为 all
是可调用的,它将被模板引擎调用)来实现与索引相同的效果。
但是,您应该使用查询集的 first
[Django docs] 方法,它会为您提供第一个对象或 None
(如果结果查询不正确,[0]
索引可能会引发异常不返回任何东西):
{% for project in projects %}
<div class="col-lg-4 col-md-6 portfolio-item filter-django">
<div class="portfolio-wrap">
<img src="{% static 'homepage/img/portfolio/portfolio-1.jpg' %}" class="img-fluid">
<div class="portfolio-info">
<h4>{{ project.title }}</h4>
{% with first_technology=project.technology.first %}
{% if first_technology is not None %}
<p>{{ first_technology }}</p>
{% else %}
<p>No technology</p>
{% endif %}
{% endwith %}
</div>
</div>
</div>
{% endfor %}