2015-10-08 1 views
1

Я прочитал об этом, но я не могу найти то, что решает мою проблему.Как отобразить объект ForeignKey в ListView - Django

Я пытаюсь отобразить таблицу со списком продуктов с эскизами. Поле миниатюр в таблице не возвращает URL-адрес, но возвращает сломанную ссылку изображения только для продуктов, у которых есть миниатюра.

Этот список продуктов использует ListView, и я могу отобразить штраф миниатюр в детальном виде продукта (а DetailView), который использует один и тот же код шаблона

Что мне нужно сделать, чтобы отобразить thumbnail для каждого продукта в ListView ... т.е. как я должен изменить свой запрос, чтобы передать миниатюру в шаблон вместе с продуктом?

Посмотреть

class ProductView(generic.ListView): 
    template_name = 'product/product.html' 
    context_object_name = 'product_list' 

    def get_queryset(self): 
     return Product.objects.all() 

Шаблон

{% for product in product_list %} 
     <tr> 
      <td><a href="/product/{{ product.id }}/">{{ product.title }}</a></td> 
      <td> {% if product.thumbnails.all %} 
        <img src="{{ product.thumbnail.url }}" alt="..."> 
        {% endif %} 
      </td> 
      <td>{{ product.category }}</td> 
      <td>{{ product.subcategory }}</td> 
      <td>{{ product.status }}</td> 
      <td>{{ product.date_added }}</td> 
    {% endfor %} 

Модель

class ProductThumbnail(models.Model): 
    product = models.ForeignKey(Product, default=None, related_name='thumbnails') 
    thumbnail = models.ImageField(upload_to='thumbnails/', 
          verbose_name='thumbnail', blank=True,) 

Пожалуйста, дайте мне знать, если требуется больше информации.

+0

Что вы эскиз хотели бы показать в таблице, если продукт имеет более чем одну миниатюру? – baxeico

+0

есть только одна миниатюра для продукта – timg

ответ

1

Если у вас есть только один миниатюру для продукта, вы должны добавить поле

thumbnail = models.ImageField(upload_to='thumbnails/', 
         verbose_name='thumbnail', blank=True) 

непосредственно на модель Product и канава ProductThumbnail модель. То, как вы разработали свою БД, позволяет иметь больше миниатюр для каждого продукта (отношения «один ко многим»), но это делает ваш код излишне сложным.

Если thumbnail было поле Product модели, вы могли бы сделать просто:

{% if product.thumbnail %} 
    <img src="{{ product.thumbnail.url }}" alt="..."> 
{% endif %} 
+0

Я не могу заставить его работать, если миниатюра является частью модели продукта, я просто не могу загрузить изображение - на мой взгляд, я сохраняю продукт и некоторые изображения с помощью набора форм. Изображения thew в форме загружают тонкие, но уменьшенное изображение в форме продукта не загружается. Любая идея, что я могу пропустить? – timg

+0

Является ли форма продукта определенной с помощью enctype = "multipart/form-data"? – baxeico

+0

Да, и на мой взгляд product_form = AddEditProductForm (request.POST, request.FILES), проверьте is_valid() и.save() – timg

1

{% if product.thumbnails.all %} должен быть {% if product.thumbnail %}

{% if product.thumbnails.all %} будет иметь смысл только если product.thumbnails была и обратная связь

EDIT: я неправильно вопрос

Вам нужно перебрать эскизами {% for thumbnail in product.thumbnails.all %}

+0

С помощью этого кода не отображается ни одна страница с поврежденным изображением, и нет миниатюры. – timg

+0

product.thumbnails - обратное отношение, потому что ProductThumbnail имеет ForeignKey для модели Product with related_name = 'thumbnails' – baxeico

+0

Извинения, я неправильно понял вопрос. Почему миниатюры обратная_реляция, если каждый продукт имеет только 1? –