【问题标题】:How to display ForeignKey object in ListView - Django如何在 ListView 中显示 ForeignKey 对象 - Django
【发布时间】:2015-10-08 14:36:23
【问题描述】:

我已阅读此内容,但找不到可以解决我的问题的内容。

我正在尝试显示带有缩略图的产品列表的表格。 表中的缩略图字段不返回 url,但返回一个损坏的图像链接仅适用于拥有缩略图的产品。

此产品列表使用 ListView,我可以在使用相同模板代码的产品的详细视图(DetailView)中很好地显示缩略图

我需要做什么才能在 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,)

如果需要更多信息,请告诉我。

【问题讨论】:

  • 如果产品有多个缩略图,您希望在表格中显示哪个缩略图?
  • 每个产品只有一个缩略图

标签: django listview django-class-based-views


【解决方案1】:

{% if product.thumbnails.all %} 应该是{% if product.thumbnail %}

{% if product.thumbnails.all %} 仅在 product.thumbnails 是反向关系时才有意义

编辑:我误读了这个问题

您需要循环浏览缩略图{% for thumbnail in product.thumbnails.all %}

【讨论】:

  • 使用此代码不会显示损坏的图像链接,也不会显示缩略图。
  • product.thumbnails 是一个反向关系,因为 ProductThumbnail 有一个 ForeignKey 到模型 Product 与 related_name='thumbnails'
  • 抱歉,我误读了这个问题。如果每个产品只有 1 个,为什么缩略图是一个 reverse_relation?
【解决方案2】:

如果每个产品只有一个缩略图,则应添加该字段

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

直接使用Product 模型并放弃ProductThumbnail 模型。您设计数据库的方式可以为每个产品提供更多缩略图(一对多关系),但这会使您的代码变得不必要地复杂。

如果thumbnailProduct 模型的一个字段,您可以这样做:

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

【讨论】:

  • 如果缩略图是产品模型的一部分,我无法让它工作,我就是无法上传图像 - 在我看来,我保存了一个产品和一些带有表单集的图像。表单集中的图像上传正常,但产品表单中的缩略图无法上传。知道我可能缺少什么吗?
  • 产品表单是否使用 enctype="multipart/form-data" 定义?
  • 是的,在我看来 product_form = AddEditProductForm(request.POST, request.FILES),检查 is_valid() 和 .save()
  • 不查看完整的form和view代码很难帮你,你可以看看Django documentation on file upload看看你做对了没有。
  • 感谢您的帮助!我不确定我做了什么,但它的工作原理!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
相关资源
最近更新 更多