如何在模板内没有循环的情况下访问 ManyToMany 字段

时间:2021-06-06 14:44:33

标签: django django-models

我为我的投资组合项目定义了以下模型:

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]'

请帮忙。

1 个答案:

答案 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 %}