使用Django ListView展示图片时出现“无关联文件”错误求助
Django ListView展示图片报错"attribute has no file associated with it"的解决办法
问题说明
我是Django新手,尝试通过ListView类展示模型中的图片,但持续出现错误“attribute has no file associated with it”。以下是我的代码:
models.py
from django.db import models class AboutModel(models.Model): person_name = models.CharField(max_length=128, null=True) person_position = models.CharField(max_length=128, null=True) person_photo = models.ImageField(upload_to='team_pictures', blank=True)
views.py
from django.views import generic from . import models class AboutPage(generic.ListView): context_object_name = 'team_list' model = models.AboutModel
app的urls.py
from django.urls import path from . import views app_name = 'app_main' urlpatterns = [ path('products_page/', views.ProductsPage.as_view(), name='products_page'), path('about_page/', views.AboutPage.as_view(), name='about_page'), path('contacts_page/', views.ContactsPage.as_view(), name='contacts_page'), ]
项目的urls.py
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static from . import views urlpatterns = [ path('', views.HomePage.as_view(), name='index'), path("admin/", admin.site.urls), path('details/', include('app_main.urls', namespace='app_main')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
模板HTML
<div class='container team_members'> {% for member in team_list %} <img src={{ member.person_photo.url }}> <br>{{ member.person_name }} - {{ member.person_position }}<br> {% endfor %} </div>
StackOverflow上的类似问题解决方案对我无效,因为那些方案使用的是自定义函数视图,或者问题本身与我的情况不同。
解决方案
报错核心原因是person_photo字段设置了blank=True,部分AboutModel实例未上传图片,直接调用.url会触发属性错误。针对ListView场景,有三种可行解决方式:
1. 模板中判断图片是否存在再渲染
修改模板代码,添加条件判断,仅当图片存在时渲染img标签:
<div class='container team_members'> {% for member in team_list %} {% if member.person_photo %} <img src="{{ member.person_photo.url }}"> {% endif %} <br>{{ member.person_name }} - {{ member.person_position }}<br> {% endfor %} </div>
2. 给ImageField设置默认图片
在模型中给person_photo添加default参数,指定一张默认图片路径(需确保该图片存在于MEDIA_ROOT对应目录下):
person_photo = models.ImageField(upload_to='team_pictures', blank=True, default='team_pictures/default_avatar.png')
3. ListView中过滤掉无图片的记录
重写ListView的get_queryset方法,仅返回带有图片的成员:
class AboutPage(generic.ListView): context_object_name = 'team_list' model = models.AboutModel def get_queryset(self): # 过滤出person_photo不为空的记录 return super().get_queryset().exclude(person_photo='')
内容的提问来源于stack exchange,提问作者Анатолий Григорович
相关产品推荐
相关产品推荐

