我有一个型号为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)