Как получить доступ к данным внутри вложенного цикла for
Я хочу сделать что-то вроде следующего в html, где отображается несколько "мест", и внутри каждого места отображаются "ссылки", связанные с каждым конкретным местом.
Как мне написать логику для отображения конкретных ссылок для каждого места?
html
{% for spot in spots %}
<div>
<h2>{{ spot.title }}</h2>
</div>
{% for link in links %}
<div>
<h3>{{ link.url }}</h3>
</div>
{% endfor %}
{% endfor %}
Мои модели выглядят следующим образом. SpotLinks - это промежуточная таблица для таблицы Links и Spots.
models.py
class Spots(models.Model):
title = models.CharField(max_length=155)
slug = models.SlugField(unique=True, max_length=155)
class Links(models.Model):
title = models.CharField(unique=True, max_length=155, blank=True)
url = models.CharField(max_length=75, blank=True)
class SpotLinks(models.Model):
link = models.ForeignKey('Links', models.DO_NOTHING)
spot = models.ForeignKey('Spots', models.DO_NOTHING)
class Articles(models.Model):
title = models.CharField(max_length=155)
slug = models.SlugField(unique=True, max_length=155)
summary = models.TextField(blank=True, null=True)
class ArticleSpots(models.Model):
article = models.ForeignKey('Articles', models.DO_NOTHING)
spot = models.ForeignKey('Spots', models.DO_NOTHING)
Я попробовал links = Links.objects.filter(spotlinks__spot=spots)
в файле views.py, но из-за того, что в споте несколько спотов, он не фильтруется
Будет ли логика написана в views.py или как шаблоны django в html-файле?
Я новичок в веб-разработке, поэтому любое направление будет полезно. Спасибо!
views.py
def article(request, slug):
article = get_object_or_404(Articles, slug=slug)
spots = Spots.objects.filter(articlespots__article=article).distinct()
links = Links.objects.filter(spotlinks__spot=spots)
context = {
'spots': spots,
'article': article,
'links': links}
return render(request, 'articletemplate.html', context)
Вам нужно добавить одно внешнее поле в модель Links для ссылки на место, поэтому модель Links будет иметь вид:
class Links(models.Model):
title = models.CharField(unique=True, max_length=155, blank=True)
url = models.CharField(max_length=75, blank=True)
spot = models.ForeignKey(Spots, on_delete=models.CASCADE, related_name="links")
Таким образом, вы можете получить ссылки для каждого спота по:
from django.shortcuts import get_object_or_404
spot = get_object_or_404(Spots, title="choose the the title") # you can filter it in your preferred way
links = spot.links.all()
Тогда, в контексте; вам не нужно отправлять ссылки вообще, вместо этого вы можете итерировать в html таким образом:
{% for spot in spots %}
<div>
<h2>{{ spot.title }}</h2>
</div>
{% for link in spot.links %}
<div>
<h3>{{ link.url }}</h3>
</div>
{% endfor %}
{% endfor %}
Для доступа к связанным объектам используйте менеджер связанных объектов.
В этом случае связанным менеджером является spot.spotlinks_set
.
{% for spot in spots %}
<div>
<h2>{{ spot.title }}</h2>
</div>
<!-- {% for link in links %} --> <!-- Replace this -->
{% for spotlink in spot.spotlinks_set.all %} <!-- with this -->
<div>
<!-- <h3>{{ link.url }}</h3> --> <!-- Replace this -->
<h3>{{ spotlink.link.url }}</h3> <!-- with this -->
</div>
{% endfor %}
{% endfor %}
Ссылка: https://docs.djangoproject.com/en/3.2/ref/models/relations/