Как получить все объекты и связанные изображения в Джанго - PullRequest
0 голосов
/ 04 января 2019

Я боролся с этим последние 2 дня, и мне действительно нужны новые данные!

Первые мои конфиги:

models.py

class Category(models.Model):
    name           = models.CharField(max_length=200)
    objects        = models.Manager()

    class Meta:
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

class Item(models.Model):
    name           = models.CharField(blank=False, max_length=200)
    description    = models.TextField(blank=False, null=True)
    date           = models.DateTimeField(blank=False, null=True)
    category       = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL)
    order          = models.IntegerField(blank=True, null=True)
    active         = models.BooleanField(blank=True, default=False)
    objects        = models.Manager()

    class Meta:
        verbose_name_plural = 'items'

class ItemImage(models.Model):
    image          = models.ImageField(blank=True, null=True)
    order          = models.IntegerField(blank=True, null=True)
    main           = models.BooleanField(blank=True, default=False)
    cover          = models.BooleanField(blank=True, default=False)
    item           = models.ForeignKey(Item, related_name='items', blank=True, null=True, on_delete=models.SET_NULL)
    objects        = models.Manager()


    class Meta:
        verbose_name_plural = 'item images'

views.py

def index(request):
    all_items = Item.objects.filter(active=True)
    pics = []
    for a in all_items:
        images = ItemImage.objects.filter(main=True)
        pics.append(images)
    propert = Item.objects.filter(active=True)
    context = {
        'pictures': pics
    }

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

Шаблон:

<div id="image-popups" class="grid">
    {% for pic in pictures %}
      <div class="item">
          <img class="lazy" src="{{ pic.image.url }}"
            data-mfp-src="{{ pic.image.url }}" 
            data-effect="mfp-zoom-in">
      </div>
    {% endfor %}
</div>

Моя цель состоит в том, чтобы получить фильтрацию всех элементов на "active = True" и всех связанных с ними изображений со значением "main = True". Я думал о том, чтобы просто запросить модель ItemImage с фильтром «main = True», но мне нужно будет получить описание и имя в будущем. Должен ли я использовать отношение ManyToMany здесь?

Я могу заставить это работать, если я использую .objects.get (pk = ..), но это возвращает только один элемент.

Конечный результат, к которому я стремлюсь:

  • image_1 из item1 с активным = True
  • image_1 из item2 с активным = True
  • image_2 из item2 с активным = True
  • image_1 из item3 с активным = True
  • и т.д.

1 Ответ

0 голосов
/ 04 января 2019

Я думаю, что вы можете просто сделать это:

Просмотр: отправить все запросы к элементам изображения через контекст

def index(request):
    context = {
        'pictures': ItemImage.objects.filter(main=True).order_by('item')
    }

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

Шаблон: перебирать элементы изображения и показывать их

<div id="image-popups" class="grid">
    {% for pic in pictures %}
      <div class="item">
          <img class="lazy" src="{{ pic.image.url }}"
            data-mfp-src="{{ pic.image.url }}" 
            data-effect="mfp-zoom-in">

         <p>{{ pic.item.name }}</p>
      </div>
    {% endfor %}
</div>

Обновление

набор запросов с изображениями из активного элемента:

 ItemImage.objects.filter(main=True, item__active=True).order_by('item')

Если вы хотите показать изображения для одного элемента, то вам нужно определить представление относительно этого. Вы можете использовать DetailView здесь.

Допустим, вы создали представление, которое возвращает элемент (аналог вашей текущей реализации), затем вы можете показать изображения, связанные с элементом в шаблоне, следующим образом:

{% for pic in item.itemimage_set.all %}
     <img class="lazy" src="{{ pic.image.url }}"
            data-mfp-src="{{ pic.image.url }}" 
            data-effect="mfp-zoom-in">

{% endfor %}

Это называется связанными объектами. Пожалуйста, смотрите документацию по этому здесь .

Наконец, допустим, вы определили свой вид, и ваш URL выглядит так:

path('item/<pk:int>/', your_view, name="item-details"),  # <-- defining name here is important

Затем вы можете предоставить URL деталей в gallery/index.html, например:

<div id="image-popups" class="grid">
    {% for pic in pictures %}
      <div class="item">
          <img class="lazy" src="{{ pic.image.url }}"
            data-mfp-src="{{ pic.image.url }}" 
            data-effect="mfp-zoom-in">

         <a href={% url 'item-details' pic.item.pk %}>{{ pic.item.name }}</a>  
      </div>
    {% endfor %}
</div>

Для с именами url, пожалуйста, смотрите документацию относительно url namespace .

...