【问题标题】:The 'photo' attribute has no file associated with it“照片”属性没有与之关联的文件
【发布时间】:2017-01-04 18:25:03
【问题描述】:
Template error:

在模板 D:\virtualEnv\alumni\member\templates\member\index.html 中,第 15 行出错

The 'photo' attribute has no file associated with it.   5 :     <!-- Albums -->
   6 :     <div class="row">
   7 :         <div class="col-sm-12">
   8 :             <h3>{{ user.username }}'s Albums</h3>
   9 :         </div>
   10 :         {% if all_persons %}
   11 :             {% for person in all_persons %}
   12 :                 <div class="col-sm-4 col-lg-2">
   13 :                     <div class="thumbnail">
   14 :                         <a href="{% url 'member:detail' person.id %}">
   15 :                             <img src=" {{ person.photo.url }} " class="img-responsive">
   16 :                         </a>
   17 :                         <div class="caption">
   18 :                             <h2>{{ person.name }}</h2>
   19 :                             <h4>{{ person.category }}</h4>
   20 : 
   21 :                             <!-- View Details -->
   22 :                             <a href="{% url 'member:detail' person.id %}" class="btn btn-primary btn-sm" role="button">View Details</a>
   23 : 
   24 :                             
   25 : 

追溯:

_resolve_lookup 中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 885. 当前=当前[位]

在处理上述异常('ImageFieldFile'对象不可下标)的过程中,又发生了一个异常:

内部文件“D:\virtualEnv\lib\site-packages\django\core\handlers\exception.py” 39. response = get_response(request)

_get_response 中的文件“D:\virtualEnv\lib\site-packages\django\core\handlers\base.py” 217. response = self.process_exception_by_middleware(e, request)

_get_response 中的文件“D:\virtualEnv\lib\site-packages\django\core\handlers\base.py” 215. response = response.render()

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\response.py” 109. self.content = self.rendered_content

render_content 中的文件“D:\virtualEnv\lib\site-packages\django\template\response.py” 86. content = template.render(context, self._request)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\backends\django.py” 66. return self.template.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 208. return self._render(context)

_render 中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 199. return self.nodelist.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 994. bit = node.render_annotated(context)

render_annotated 中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 961. return self.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\loader_tags.py” 61. 结果 = self.nodelist.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 994. bit = node.render_annotated(context)

render_annotated 中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 961. return self.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\defaulttags.py” 323. 返回nodelist.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 994. bit = node.render_annotated(context)

render_annotated 中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 961.返回self.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\defaulttags.py” 217. nodelist.append(node.render_annotated(context))

render_annotated 中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 961. return self.render(context)

渲染中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 1044. 输出 = self.filter_expression.resolve(context)

解析中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 711. obj = self.var.resolve(context)

解析中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 852. value = self._resolve_lookup(context)

_resolve_lookup 中的文件“D:\virtualEnv\lib\site-packages\django\template\base.py” 893. current = getattr(current, bit)

_get_url 中的文件“D:\virtualEnv\lib\site-packages\django\db\models\fields\files.py” 68. self._require_file()

_require_file 中的文件“D:\virtualEnv\lib\site-packages\django\db\models\fields\files.py” 46. raise ValueError("'%s' 属性没有与之关联的文件。" % self.field.name)

异常类型:ValueError at / 异常值:“照片”属性没有与之关联的文件。

我的观点:

class IndexView(generic.ListView):
    template_name = 'member/index.html'
    context_object_name = 'all_persons'

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

class DetailView(generic.DetailView):
    model = Person
    template_name = 'member/detail.html'


class AlbumCreate(CreateView):
    model = Person
    fields = '__all__'

我的模型是:

class Person(models.Model):
    name = models.CharField(max_length=128)
    present_position=models.CharField(max_length=100)
    organization= models.CharField(max_length=150,blank=True)
    address = models.CharField(max_length=150, blank=True)
    tele_land = models.CharField(max_length=15,blank=True)
    tele_cell = models.CharField(max_length=15, blank=True)
    email = models.EmailField(max_length=70, blank=True, null=True, unique=True)
    photo= models.ImageField(upload_to='persons/%Y/%m/%d/',max_length=70, blank=True )
    category = models.ForeignKey('Membership', on_delete=models.CASCADE)

    def get_absolute_url(self):
        return reverse('member:detail', kwargs={'pk': self.pk})

class Membership(models.Model):
    category = models.CharField(max_length=50, blank=False)

网址:

from . import views    
app_name = 'member'
urlpatterns = [    
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'member/add/$', views.AlbumCreate.as_view(), name='member-add'),
]

详细模板:

<div class="col-sm-4 col-md-3">
            <div class="panel panel-default">
                <div class="panel-body">
                    <a href="{% url 'member:detail' person.id %}">
                        {% if member.photo %}
                            <img src="{{ member.photo.url }}" class="img-responsive">
                        {% else %}
                            <h3>No image to display</h3>
                        {% endif %}
                    </a>
                    <p>{{member.name}}</p>
                    <p>{{member.present_position}}</p>
                    <p>{{member.organization}}</p>
                    <p>{{member.address}}</p>
                    <p>{{member.tele_land}}</p>
                    <p>{{member.tele_cell}}</p>
                    <p>{{member.email}}</p>
                </div>
            </div>
        </div>

项目网址:

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from  django.conf.urls.static import static
from member import urls as member_urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(member_urls, namespace="member")),
]
if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

为什么照片字段会出现这些错误?

【问题讨论】:

标签: django image templates django-models


【解决方案1】:

删除之前所有没有图片属性或使用的记录

<img src="{{ person.photo_url|default_if_none:'#' }}" />

【讨论】:

    【解决方案2】:

    可能是您的ImageField 在某些时候没有得到任何图像,但在其他地方您正试图使用​​图像的路径(这是不存在)。其他人也指出了同样的事情。当您在保存图像之前尝试预处理图像时,这可能发生在模板{{ post.post_image.url }}views.py 甚至models.py 中。无论你在哪里使用它都要小心并使用try-except 块。

    from PIL import Image     # I was using pillow to pre-process
    ...
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        try:
            img = Image.open(self.post_image.path)
        except:
            print("Do something.. break or return")
            return  
    

    【讨论】:

      【解决方案3】:

      我亲爱的朋友,ohid 的解决方案很好但还不够,因为如果用户没有头像,您应该显示默认图像。因此,您可以按照以下步骤操作:

      将此方法添加到您的人物模型中:

      @property
      def get_photo_url(self):
          if self.photo and hasattr(self.photo, 'url'):
              return self.photo.url
          else:
              return "/static/images/user.jpg"
      

      您可以使用任何路径(/media、/static 等),但不要忘记将默认用户照片作为 user.jpg 放入您的路径。

      并在模板中更改您的代码,如下所示:

      <img src="{{ person.get_photo_url }}" class="img-responsive thumbnail " alt="img">
      

      【讨论】:

        【解决方案4】:

        尝试返回“完整 URL”,方法是不调用没有 .url 部分的 FileField 字段/属性名称,例如person.photo 而不是 person.photo.url

        N/B: 我只在 DRF(djangorestframework) 序列化程序 类中的 REST API 上对其进行了测试,不确定它是否适用于 django 模板,但是值得一试

        【讨论】:

          【解决方案5】:

          我在模型中使用 Stackoverflow 的答案解决了这个问题:

          @property
          def photo_url(self):
              if self.photo and hasattr(self.photo, 'url'):
                  return self.photo.url
          

          在模板中,使用 default_if_none 作为默认 url:

          <img src="{{ person.photo_url|default_if_none:'#' }}" />
          

          经过大量搜索和多次花费,这实际上为我提供了正确的答案。

          希望它能帮助其他人在 django 模板中加载图像。

          【讨论】:

          • 这不起作用:>>> hasattr(a,'url') Traceback(最近一次调用最后):文件“”,第 1 行,在 文件“/home /deploy/backend/.enviroment/lib/python3.5/site-packages/django/db/models/fields/files.py”,第 68 行,在 _get_url self._require_file() 文件“/home/deploy/backend/ .enviroment/lib/python3.5/site-packages/django/db/models/fields/files.py",第 46 行,在 _require_file 中引发 ValueError("'%s' 属性没有与之关联的文件。" % self.field.name) ValueError: 'avatar' 属性没有与之关联的文件。 >>>
          猜你喜欢
          • 1970-01-01
          • 2015-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-21
          • 2021-11-18
          • 2021-02-11
          相关资源
          最近更新 更多