Django 2.2 + DetailView Несколько моделей с фильтрацией - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь заставить мои три модели работать правильно на одном DetailView. У меня все они загружены, но модель, которая содержит изображения, продолжает показывать первое изображение. Я знаю, что мне нужно как-то отфильтровать, но я не знаю, как это сделать. Так как мне нужна информация о продукте для фильтрации изображений. Вот мой код:

вид:

class VendorDetailView(DetailView):
    context_object_name = 'vendor_detail'
    model = Vendor
    queryset = Vendor.objects.all()
    template_name = 'vendor_details.html'

    def get_context_data(self, **kwargs):
        context = super(VendorDetailView, self).get_context_data(**kwargs)
        context['products'] = Product.objects.filter(vendor=self.get_object())
        context['image'] = ProductImage.objects.all()
        return context

Модель:

class Product(models.Model):
    product_model = models.CharField(max_length=100)
    vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=200, unique=True, null=True)
    length = models.CharField(max_length=50)
    length_range = models.ForeignKey(LengthRange, on_delete=models.SET_NULL, null=True, blank=True)
    hull_type = models.ForeignKey(Hull, on_delete=models.SET_NULL, null=True, blank=True)
    max_beam = models.CharField(max_length=50, blank=True, default='0')
    cockpit_length = models.CharField(max_length=50, blank=True, default='0')
    cockpit_beam = models.CharField(max_length=50, blank=True, default='0')
    price = models.DecimalField(decimal_places=2, max_digits=50)
    power = models.ForeignKey(PowerConfiguration, on_delete=models.SET_NULL, null=True, blank=True)
    average_bare_hull_weight = models.CharField(max_length=50, blank=True, default='0')
    fuel_capacity = models.CharField(max_length=50, blank=True, default='0')
    seating_capacity = models.ForeignKey(Seat, on_delete=models.SET_NULL, null=True, blank=True)
    speed = models.ForeignKey(SpeedRange, on_delete=models.SET_NULL, null=True, blank=True)
    warranty = models.CharField(max_length=256, default='None')
    hull_only_available = models.BooleanField(blank=False, default=False)
    description = models.TextField()
    featured = models.BooleanField(blank=False, default=False)

    class Meta:
        ordering = ['product_model']

    def __str__(self):
        return '{} {}'.format(self.vendor, self.product_model)

    def save(self, *args, **kwargs):
        # just check if product_model or vendor.name has changed
        self.slug = '-'.join((slugify(self.vendor.name), slugify(self.product_model)))
        super(Product, self).save(*args, **kwargs)

class ProductImage(models.Model):
    product = models.ForeignKey(Product, related_name='images', on_delete=models.CASCADE)
    image = models.ImageField(upload_to='product_images', blank='img/92-thumb.jpg')

class Vendor(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=200, unique=True, null=True)
    website = models.CharField(max_length=256)
    vendor_email = models.CharField(max_length=100)
    images = models.ImageField(upload_to='vendor_images', blank='img/92-thumb.jpg')
    description = models.TextField()

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        # just check if product_model or vendor.name has changed
        self.slug = slugify(self.name)
        super(Vendor, self).save(*args, **kwargs)

Шаблон:

<div class="preview col-md-4">

                        <div class="vendor-pic">
                            {% if vendor_detail.images %}
                                <div class="tab-pane">
                                    <img class="vendor-preview" src="{{ vendor_detail.images.url }}"/></div>
                            {% endif %}
                        </div>
**[snipped for brevity]**
                    </div>
                    <div class="details col-md-6">
                        <h3 class="vendor-title">{{ vendor_detail.name }} Boats</h3>
                        <p class="vendor-description">{{ vendor_detail.description | linebreaksbr }}</p>
                        <h5 class="website">website: <span>{{ vendor_detail.website }}</span></h5>
                    </div>
                </div>

{% for product in products %}

            <div class="product-card">
                <div class="product">
                    <div class="top">{% for product_image in image.all %}
                        {% if product_image.image %}
                            <img class="product-img" src="{{ product_image.image.url }}">
                        {% endif %}
                    {% endfor %}
                    </div>
                    <div class="bottom">
                        <div class="left">
                            <div class="details">
                                <h3>{{ product.vendor }} {{ product.product_model }}</h3>
                                <p>Starting at ${{ product.price|intcomma }}</p>
                            </div>
                            <div class="buy"><a
                                    href="{% url 'boatsales:product_detail' product.slug %}"><i
                                    class="material-icons">pageview</i></a></div>
                        </div>
                    </div>
                </div>
                <div class="inside">
                    <div class="icon"><i class="material-icons">info_outline</i></div>
                    <div class="contents">
                        <p style="text-align: justify">{{ product.description|linebreaksbr }}</p>
                    </div>
                </div>
            </div>
        {% endfor %}

Я пробовал несколько способов отфильтровать изображения продуктов, но единственное, что я могу получить, это ProductImages.objects.all (), что, конечно, неверно. Любая помощь, которую вы можете предоставить, будет принята с благодарностью. Заранее спасибо.

1 Ответ

0 голосов
/ 12 апреля 2019

Вам не нужен набор запросов для изображений, вы можете получить к ним доступ через экземпляры Product, используя related_name, например:

{% for product in products %}
  <div class="product-card">
    <div class="product">
      <div class="top">
        {% for product_image in product.images.all %}
          <img class="product-img" src="{{ product_image.image.url }}">
        {% endfor %}
      </div>
      ...
  </div>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...