Как получить значение в шаблоне из модели через другую? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть две модели, связанные отношением один ко многим.Как я могу получить значение из одного поля одной модели через другую?Мне нужно получить значение "низкий" из модели изображения из модели альбома.В моей модели Image "low" - это путь к копии изображения в низком разрешении, а "path_to_image" - это путь к полноразмерной.

Я использую Django 2.1, встроенную sqlite db.

models.py:

from django.db import models
from django.utils.timezone import now

class Album(models.Model):
    title = models.CharField(max_length=120)

    def __str__(self):
            return self.title

class Image(models.Model):
    path_to_image = models.CharField(max_length=120)
    low = models.CharField(max_length=120)
    pub_date = models.DateField(default=now)
    album = models.ForeignKey(Album, on_delete=models.CASCADE)

    def __str__(self):
            return self.path_to_image

views.py:

def albums(request):
    albums_list = Album.objects.all()
    paginator = Paginator(albums_list, 20)
    page = request.GET.get('page')
    albums = paginator.get_page(page)
    random_idx = random.randint(0, Image.objects.count() - 1)
    image = Image.objects.all()[random_idx]

    context = {
            'albums': albums,
            'image': image,
    }

    return render(request, 'gallery/albums.html', context)

album.html:

<div class="item2 my-gallery responsive" itemscope itemtype="http://schema.org/ImageGallery">
    {% for album in albums %}
       <div class="gallery">
            <a href="/albums/{{ album.id }}">
                <img src="{{album.image_set.model.low}}" width="300" height="225">
            </a>
            <div class="desc">{{album}}</div>
        </div>
    {% endfor %}
</div>

Я хочу получить значениеИз модели изображения я это <img> тег.Итак, это возможно без рефакторинга всего кода полностью?(Кроме того, в файле views.py я пытался получить случайное изображение из альбома, чтобы установить его в качестве предварительного просмотра, но оно тоже не работает.)

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Из того, что я понимаю, ваш текущий вид возвращает случайное изображение, которое может вообще не относиться к альбому.Я бы перебрал альбомы и нашел случайное изображение для каждого альбома, если это уместно.Вот так:

def albums(request):
albums = Album.objects.all()
albums_list = []
for album in albums:
    album_list.append({
        album_images = Image.objects.filter(album=album)
        'id'=album.pk,
        'image_low'= album_images[random.randint(0, album_images.count() - 1)].low
        'title'=album.title
    })
paginator = Paginator(albums_list, 20)
page = request.GET.get('page')
albums = paginator.get_page(page)

context = {
        'albums': albums,
        'image': image,
}

return render(request, 'gallery/albums.html', context)

Затем вы можете получить доступ к альбомам в шаблоне, как этот

    <div class="item2 my-gallery responsive" itemscope itemtype="http://schema.org/ImageGallery">
    {% for album in albums %}
       <div class="gallery">
            <a href="/albums/{{ album.id }}">
                <img src="{{album.image_low}}" width="300" height="225">
            </a>
            <div class="desc">{{album.title}}</div>
        </div>
    {% endfor %}
</div>
0 голосов
/ 09 февраля 2019

Чтобы получить значение low для первого изображения в каждом альбоме, вы можете сделать следующее:

album.html:

<div class="item2 my-gallery responsive" itemscope itemtype="http://schema.org/ImageGallery">
    {% for album in albums %}
       <div class="gallery">
            <a href="/albums/{{ album.id }}">
                <img src="{{album.image_set.first.low}}" width="300" height="225">
            </a>
            <div class="desc">{{album}}</div>
        </div>
    {% endfor %}
</div>

Единственная разница - {{album.image_set.first.low}} где мы выбираем первый элемент в наборе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...