如何上传多张图片并与模型关联

时间:2019-12-20 17:02:37

标签: django django-models django-forms django-templates django-views

尝试上传多张图片时出现错误

问题描述:

我有一个型号为Vehicle的车辆,上面有车辆信息以及封面照片。要为画廊添加图像,我需要第二个模型VehicleImage,它带有Vehicle的外键。我正在尝试使用单个文件选择器上传多个图像,并将所有图像保存到定义的路径(/ media / vehicles / vehicle#/),但我尝试了不同的视图,但无济于事。现在我遇到以下错误。

Raised by:  main.views.ImageFieldView
No vehicle image found matching the query

谢谢您,任何帮助将不胜感激。我还在学习,但我每天都在努力。

models.py


def vehicle_directory_path(instance, filename):
    #! file will be uploaded to media_cdn/vehicle/<id>/<filename>.<ext>
    ext = filename.split('.')[-1]
    name = filename.split('.')[0]
    vehicle = Vehicle.objects.get(id=instance.id)
    return 'vehicles/{0}/{1}.{2}'.format(vehicle.id, name, ext)

class VehicleImage(models.Model):

    vehicle = models.ForeignKey('Vehicle', on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to=vehicle_directory_path, null=True, blank=True)

forms.py

class ImageFieldForm(forms.ModelForm):
    image_field = forms.ImageField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
    class Meta:
        model = VehicleImage
        exclude = ('image', 'vehicle')

views.py

class ImageFieldView(CreateView):
    model = VehicleImage
    form_class = ImageFieldForm
    def get(self, request, *args, **kwargs):
        context = {'form': ImageFieldForm}
        return render(request, 'main/vehicle_upload.html', context)

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('image_field')
        if form.is_valid():
            for file in files:
                instance = VehicleImage(
                    vehicle=Vehicle.objects.get(pk=kwargs['pk']),
                    image=file)
                instance.save()
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

urls.py

urlpatterns = [
    path('', views.homepage, name='homepage'),
    path('vehicles/', views.vehicles, name='vehicles'),
    path('vehicles/detail/<int:pk>/', views.VehicleDetail.as_view(), name='vehicle_detail'),
    path('vehicles/edit/<int:pk>/', views.VehicleEdit.as_view(), name='vehicle_edit'),
    path('vehicles/images/upload/<int:pk>', views.ImageFieldView.as_view(),name='vehicle_image_upload'),
#    path('vehicle/image/add/<int:pk>/', views.VehicleEdit.as_view(), name='vehicle_image'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

建议的修改:仍然出现相同的错误

        vehicles = Vehicle.objects.get(pk=kwargs['pk'])
        if form.is_valid():
            for f in files:
                VehicleImage.objects.create(vehicle=vehicles, image=f)
            return self.form_valid(form)

0 个答案:

没有答案