Как получить доступ к данным внутри вложенного цикла 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/

Вернуться на верх