使用Django如何分别存储包装箱与设备两类图片对应的描述信息
解决方案
核心问题是前端两个上传控件使用了相同的name属性,后台无法区分图片所属分类,所有图片统一赋值了两类描述导致异常。按以下三步修改即可:
1. 修改前端表单Receptionunservicable.html
将两个上传控件的name属性区分开,避免两类图片混同:
<!-- 包装箱上传部分修改为 --> <div> <label>Upload Box Photo</label> <input required name="box_images" type="file" multiple class="form-control-file"> </div> <!-- 设备上传部分修改为 --> <div> <label>Upload Equipment Photo</label> <input required name="equipment_images" type="file" multiple class="form-control-file"> </div>
表单其余代码保持不变。
2. 修改models.py适配存储逻辑
因为包装箱图片记录不需要设备描述、设备图片记录不需要包装箱描述,所以将两个描述字段设置为可空,避免创建时报字段校验错误:
class Photo(models.Model): class Meta: verbose_name = 'Photo' verbose_name_plural = 'Photos' image = models.ImageField(null=False, blank=False) # 两个描述字段改为可空 descriptionbox = models.TextField(blank=True, null=True) serialno = models.TextField() partno = models.TextField() reception = models.TextField() customername = models.TextField() descriptionequipment = models.TextField(blank=True, null=True) def __str__(self): return self.descriptionbox or self.descriptionequipment
修改完成后执行以下命令更新数据库结构:python manage.py makemigrationspython manage.py migrate
3. 修改views.py分分类处理上传逻辑
后台分别获取两类图片列表,创建记录时仅赋值对应分类的描述字段:
@login_required() def ReceptionUnserviceable(request): descriptionbox = Photo.objects.all() if request.method == 'POST': data = request.POST # 分别获取两类上传图片 box_images = request.FILES.getlist('box_images') equipment_images = request.FILES.getlist('equipment_images') # 批量创建包装箱图片记录 for image in box_images: Photo.objects.create( descriptionbox=data['descriptionbox'], image=image, serialno=data['serialno'], partno=data['partno'], reception=data['reception'], customername=data['customername'], descriptionequipment=None ) # 批量创建设备图片记录 for image in equipment_images: Photo.objects.create( descriptionbox=None, image=image, serialno=data['serialno'], partno=data['partno'], reception=data['reception'], customername=data['customername'], descriptionequipment=data['descriptionequipment'] ) return redirect('success') context = {} return render(request, 'ReceptionUnserviceable.html', context)
内容的提问来源于stack exchange,提问作者Rainysky
相关产品推荐
相关产品推荐

