Ссылка на объект модели с несколькими словами в Django - PullRequest
1 голос
/ 27 июня 2019

Это может быть просто, но это действительно причиняет мне головную боль. У меня есть модель Miltiword ListingImages, которая связана с другой моделью Listing. Я извлекаю данные Listing и использую их для доступа к объектам ListingImages. Однако я не получаю желаемого результата. Вот мои файлы.

models.py

class Listing(models.Model):
    listing_title = models.CharField(max_length=255)

class ListingImages(models.Model):
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE)
    image_url = models.ImageField(upload_to=get_image_filename,
                          verbose_name='Listing Images')

    def get_image_filename(instance, filename):
        title = instance.listing.listing_title
        slug = slugify(title)
        return "listings_pics/%s-%s" % (slug, filename)

views.py

    def index(request):
        context = {
            'listings': Listing.objects.filter(status=True)
        }
        return render(request, 'base/index.html', context)

фрагмент шаблона index.html

    <!--Listing start-->
<div class="property-item col-lg-3 col-md-6 col-12 mb-40">
    <div class="property-inner">
        <div class="image">
            <a href="single-properties.html"><img src="{{ listing.listingImages.image_url.url }}" alt=""></a>
            <ul class="property-feature">
                <li>
                    <span class="area"><img src="{% static 'base/assets/images/icons/area.png' %}" alt="">{{ listing.property.land_size }} SqFt</span>
                </li>
                <li>
                    <span class="bed"><img src="{% static 'base/assets/images/icons/bed.png' %}" alt="">{{ listing.property.bedrooms }}</span>
                </li>
                <li>
                    <span class="bath"><img src="{% static 'base/assets/images/icons/bath.png' %}" alt="">{{ listing.property.bathrooms }}</span>
                </li>
                <li>
                    <span class="parking"><img src="{% static 'base/assets/images/icons/parking.png' %}" alt="">{{ listing.property.car_spaces }}</span>
                </li>
            </ul>
        </div>
        <div class="content">
            <div class="left">
                <h3 class="title"><a href="single-properties.html">{{ listing.listing_title }}</a></h3>
                <span class="location"><img src="{% static 'base/assets/images/icons/marker.png' %}" alt="">{{ listing.city }}</span>
            </div>
            <div class="right">
                <div class="type-wrap">
                    <span class="price">Kshs {{ listing.property.price }}</span>
                    <span class="type">{{ listing.property.get_for_sale_rent_display }}</span>
                </div>
            </div>
        </div>
    </div>
</div>
<!--Listing end-->

Однако в шаблоне я не получаю URL изображения, а вместо этого я получаю <img src="(unknown)" alt="">. Я не понимаю, что делаю неправильно, также я не уверен, как ссылаться на модель с несколькими словами ListingImages, должна ли она быть listingImages или listing-images или listing_images.

1 Ответ

0 голосов
/ 27 июня 2019

Прямой ответ на ваш вопрос: правильный вызов будет listing.listingimages_set.all() - он вернет набор запросов всех изображений листинга определенного экземпляра списка.

Кроме того, я бы советовал не передавать набор запросов вшаблон Джанго.Я думаю, что лучше создать контекст шаблона из примитивов Python и передать его.Таким образом, легче отлаживать и рассуждать об этом:

def index(request):
    listings = Listing.objects.filter(status=True).prefetch_related('listingimages_set')
    context = {
        'listings': [
            {
                'title': listing.listing_title,
                'images': list(listing.listingimages_set.all()),
            } for listing in listings
        ]
    }
    return render(request, 'base/index.html', context)

Тогда вы можете ссылаться на изображение листинга в вашем шаблоне как

<ul>
{% for listing in listings %}
    <li>
        {{ listing.title }}
        <ul>
        {% for image in listing.images %}
            <li>{{ image.image_url }}</li>
        {% endfor %}
        </ul>
    </li>
{% endfor %}
</ul>

Это, конечно, простопример.Но это показывает, что таким образом вы получаете больший контроль над контекстом шаблона и можете отлаживать его содержимое до того, как он попадет на визуализированную HTML-страницу.

Кстати, наиболее распространенным и принятым соглашением является вызов моделей с однимимя существительное.Например, ListingImage вместо ListingImages.

...