Есть ли способ получить от модели и отобразить количество изображений на рекламу, которые разместил пользователь - PullRequest
0 голосов
/ 26 сентября 2019

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

My Model

class Advert(models.Model):
    """All adverts"""

    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published')
    )

    title = models.CharField(max_length=49)
    description = models.TextField()
    price = models.PositiveIntegerField()
    date_created = models.DateTimeField(auto_now_add=True)
    date_posted = models.DateTimeField(auto_now=True)
    state = models.ForeignKey(State, on_delete=models.DO_NOTHING)
    city = models.CharField(max_length=255, blank=True, null=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)

    status = models.CharField(
        max_length=10, choices=STATUS_CHOICES, default='draft')
    image_primary = models.ImageField(
        upload_to="product_pictures", verbose_name='Image (required)')
    image_2 = models.ImageField(
        upload_to="product_pictures", blank=True, null=True)
    image_3 = models.ImageField(
        upload_to="product_pictures", blank=True, null=True)
    image_4 = models.ImageField(
        upload_to="product_pictures", blank=True, null=True)
    image_5 = models.ImageField(
        upload_to="product_pictures", blank=True, null=True, default=None)

    class Meta:
        ordering = ['-id']

    def __str__(self):
        return self.title
my View

def view_all(request):
    """View All view"""
    view_all_list = Advert.objects.all().order_by('date_posted')
    context = {
        "view_all_list": view_all_list
    }
    return render(request, 'view-all.html', context)
my template 

{% for items in view_all_list %}
    <a href="" class="col card-sm">
      <div class=" row">
        <span class="numbertext"><i style="margin-right: 4px;" class="fas fa-camera"></i>{{items.****}}</span>
        <img src="{{items.image_primary.url}}" alt="">
      </div>
      <div class="row" title="{{items.title}} | {{items.price}}">
        <h5>{{items.title}}</h5>
        <h4>{{items.price}}</h4>
      </div>
    </a>
    {% endfor %}

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

{{items.****}}

1 Ответ

0 голосов
/ 26 сентября 2019

Чтобы ответить на ваш вопрос, добавьте что-то вроде этого в качестве модельного метода:

class Advert(models.Model):
    ...

    @property
    def image_count(self):
        image_count = 1
        if self.image_2:
            image_count += 1
        if self.image_3:
            image_count += 1
        if self.image_4:
            image_count += 1
        if self.image_5:
            image_count += 1
        return image_count

И в вашем шаблоне:

{{ items.image_count }}

Однако это не похоже на оченьхорошая схема базы данных.Вместо этого было бы более разумно (для меня) иметь другую модель, например,

class AdvertImage(models.Model):
    advert = models.ForeignKey(
        Advert,
        on_delete=models.CASCADE,
        related_name='images',
    )
    image = models.ImageField()

Таким образом, вы можете:

  1. иметь столько изображений, сколько вы хотите (но все же применятьмаксимум на объявление, возможно, при проверке формы или с использованием наборов форм.)
  2. Просто сделайте что-то вроде advert.images.count(), чтобы получить количество изображений, или в шаблоне: {{ advert.images.count }}.
  3. Естьменее повторяющийся код.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...