在 Django 中使用 ImageField 上传图片

uploading image using ImageField in Django

每次我在表单上单击提交时,我都在尝试使用 Django 的 ImageField 和表单上传文件。 form.is_valid returns false 所以我打印了 forms.errors 它说

photo2
This field is required.

photo1
This field is required.

我select我要上传的图像文件,它仍然说字段是必需的。

这是我的 settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

这里是views.py

 def upload(request):
 if request.method=="POST":
     prod = Product()
     form = UploadForm(request.POST, request.FILES)
     if form.is_valid():
         prod.name = form.cleaned_data.get('name')
         prod.brand = form.cleaned_data.get('brand')
         prod.material = form.cleaned_data.get('material')
         prod.color = form.cleaned_data.get('color')
         prod.price = form.cleaned_data.get('price')
         prod.discount = form.cleaned_data.get('discount')
         prod.sex=form.cleaned_data.get('sex')
         prod.photo1 = form.cleaned_data('photo1')
         prod.photo2 = form.cleaned_data('photo2')
         prod.save()
         return render(request, 'upload.html', {'form': form})
     else:
         x = form.errors
         return render(request,'upload.html', {'alert':x}, {'form': form})

 else:
     form = UploadForm
     return render(request, 'upload.html', {'form': form})

这是我的models.py

class Product(models.Model):
    name = models.CharField(max_length=200, default='N/A')
    brand = models.CharField(max_length=50, default='N/A')
    material = models.CharField(max_length=50, default='N/A')
    color = models.CharField(max_length=20, default='N/A')
    price = models.IntegerField(default=0)
    discount = models.IntegerField(default=0)
    discountprice = models.IntegerField(default=0)
    photo1 = models.ImageField(upload_to='productphotos/')
    photo2 = models.ImageField(upload_to='productphotos/')

    Male = 'M'
    Female = 'F'
    Both = 'Both'

    Genders = ((Male, 'Male'),(Female, 'Female'), (Both, 'Both'))
    sex = models.CharField(choices=Genders, default=Male, max_length=6)

forms.py class上传表格(forms.ModelForm):

    class Meta:
        model = Product
        fields = ['name', 'brand', 'material', 'sex', 'color', 'price', 'discount', 'photo1', 'photo2']

在我的模板中 我正在使用

<div>
 {{form}}
</div>

提前感谢您的帮助。如果需要,我可以上传 forms.py。

您需要在模板中提供表单标记,因为呈现时不包含它 {{ form }}:

<form action="." method="post" enctype="multipart/form-data">
    {% csrf_token %}  # if needed
    {{ form }}
</form>

从表单发布文件时,enctype="multipart/form-data" 是必不可少的。具体见docs on forms in general and those on file uploads

Note that request.FILES will only contain data if the request method was POST and the form that posted the request has the attribute enctype="multipart/form-data". Otherwise, request.FILES will be empty.