如何为多图片数据创建Django模型?解决newsImage_set不存在错误
解决Django中CseDepartment与NewsImage关联报错及多图展示问题
问题原因
报错'CseDepartment'没有'newsImage_set'属性,是因为Django默认的反向关联名称规则是小写模型名+_set,你的模型名为NewsImage,所以正确的反向关联名称是newsimage_set,你写的newsImage_set大小写错误,导致无法识别。
修复方案
方案1:临时修正反向关联名称
直接修改views.py中的查询代码,把newsImage_set改成正确的小写形式:
def cse_news(request, pk): cseDepartment = CseDepartment.objects.get(id=pk) # 修正为小写的newsimage_set images = cseDepartment.newsimage_set.all().order_by('-created') context = {'news' : cseDepartment, 'newsImages' : images} return render(request, 'website/cse_news.html', context)
方案2:自定义反向关联名称(推荐)
通过给ForeignKey添加related_name参数,自定义更直观的关联名称,同时规范字段命名:
- 修改
models.py中的NewsImage模型:
class NewsImage(models.Model): # 字段名改用下划线命名(符合PEP8规范),添加related_name='images' cse_department = models.ForeignKey(CseDepartment, on_delete=models.CASCADE, related_name='images') image = models.CharField(max_length=300) updated = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.image[:50]
- 修改
views.py中的查询代码,使用自定义的关联名称:
def cse_news(request, pk): cse_department = CseDepartment.objects.get(id=pk) # 直接使用related_name指定的'images'获取关联图片 images = cse_department.images.all().order_by('-created') context = {'news': cse_department, 'newsImages': images} return render(request, 'website/cse_news.html', context)
额外优化建议
- 修正URL的pk类型:模型的
id是整数类型,把urls.py中的<str:pk>改成<int:pk>:
path('cse_news/<int:pk>/', views.cse_news, name="news"),
- 完善模板的图片alt属性:提升页面可访问性,给图片添加有意义的alt文本:
<h3>{{news.title}}</h3> {% for pic in newsImages %} <img src="{{pic.image}}" alt="{{news.title}} 配图"> {% endfor %}
内容的提问来源于stack exchange,提问作者Jenin Joseph
相关产品推荐
相关产品推荐

