【问题标题】:ValueError The 'image' attribute has no file associated with itValueError \'image\' 属性没有与之关联的文件
【发布时间】:2023-02-21 21:13:37
【问题描述】:

当上下文 QuerySet 中有多个对象时,我遇到了 Django 模板未在 image.url 中接收任何数据的问题,所有其他数据都工作正常。如果 QuerySet 中只有一个对象,则 image.url 可以正常工作。我将图像存储在 S3 上,图像或存储桶权限没有任何问题。

我是 Django 模板的新手,有什么我遗漏的吗?

这是代码:


模型.py

`
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
from django.utils.translation import gettext_lazy as _
from site_content.models import PageCategory, Page
from site_content.utils import file_upload_to

class PpcOffersPagesManager(models.Manager):

   def get_queryset(self):
       return super(PpcOffersPagesManager, self) \
          .get_queryset() \
          .filter(page_category__category_name="ppc-offer-page")


class PpcOfferPages(Page):

   objects = PpcOffersPagesManager()

   class Meta:
       proxy = True

   def __str__(self):
       return self.page_name

   def save(self, *args, **kwargs):
       self.page_category = PageCategory.objects.get(category_name="ppc-offer-page")
       self.page_site_type = "ppc"
       super(PpcOfferPages, self).save(*args, **kwargs)


class PpcOfferContent(models.Model):
    related_page = models.ForeignKey(
       Page, verbose_name=_("Page"),
       related_name="ppc_offer_content",
       on_delete=models.SET_NULL, 
       null=True
   )
   order = models.IntegerField(verbose_name=_("Order of offer appearance"), default=0)
   image = models.ImageField(
       verbose_name=_("Casino banner image"), 
       upload_to=file_upload_to, 
       null=True, 
       blank=True,
       help_text="Casino banner image, Size (300x500)"
   )
   header = models.CharField(
       verbose_name=_("Header text"), 
       max_length=500, 
       null=False, 
       blank=False
   )
   is_active = models.BooleanField(verbose_name=_("Is offer active"), default=True)

   class Meta:
       verbose_name = _('PPC_Offer Page Content')
       verbose_name_plural = _('PPC_Offer Page Content')

   def __str__(self):
       return self.related_page.page_name
`

视图.py

`
from django.views.generic import DetailView
from ppc_site_control.models import PpcOfferContent

class PpcOffersDetailView(DetailView):
   model = PpcOfferContent
   def get_template_names(self):
       page = self.model.objects \
           .filter(related_page__slug = self.kwargs['slug']) \
           .first().related_page.page_template.template_path
       return page

   def get_object(self):
       return self.model.objects \
           .filter(related_page__slug=self.kwargs['slug']) \
           .filter(is_active=True) \
           .order_by('offer_order')

   def get_context_data(self, **kwargs):
       context = super().get_context_data(**kwargs)
       return context
`

.html

`
{% extends "slotsselection/base.html" %}
{% load i18n static reviews sstags %}

{% for offer in object %}
   <div>
       <div >
           <img loading="lazy" src="{{offer.offer_image.url}}" alt="image">
       </div>
       <div>
       <p>{{offer.header}}</p>
       <p>{{offer.is_active }}</p>
       </div>
  <div>
{% endfor %}
`

我尝试在上下文中发送数据作为新键并再次使用 .values() 添加 QuerySet 对象(以排除“get_object”查询出现问题的可能性)仍然有相同的结果。当我从模板中删除图像时,所有其他数据都会相应显示,没有图像。

我也试过 ListView 同样的错误 ValueError The 'image' attribute has no file associated with it.

上下文中的数据:

`{'object': <QuerySet [<PpcOfferContent: PPC PageName>, 
 <PpcOfferContent: PPC PageName>, <PpcOfferContent: PPC PageName>, 
 <PpcOfferContent: PPC PageName>]>, 'view': 
 <ppc_site_control.views.PpcOffersDetailView object at 0x7f2d8230f430>}
`

【问题讨论】:

    标签: django-templates detailview


    【解决方案1】:

    问题是由于缺少图像引起的,因为模型中不需要图像,最简单的解决方案是在模板中添加“if”条件:

    `{% if offer.offer_image %}
        <img loading="lazy" src="{{offer.image.url}}" alt="Casino image">
     {% endif %}`
    

    我也设法找到解决方法:

    视图.py

    `from slotsselection.components.s3_settings import MEDIA_URL` 
    

    然后在我添加的上下文数据中

     `def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['media_url'] = MEDIA_URL
        return context
     `
    

    .html

    在 html 中,我删除了 .url 以获得链接的一半作为字符串并添加了 media_url

    `<img loading="lazy" src="{{media_url}}{{offer.offer_image}}" alt="Casino image">`
    

    不是最好的方法,但它有效。

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 2020-01-16
      • 2021-02-11
      • 2020-03-08
      • 2020-08-11
      • 1970-01-01
      • 2022-12-11
      • 2019-02-19
      相关资源
      最近更新 更多