简体   繁体   English

在Django中使用ImageField上传图像

[英]uploading image using ImageField in Django

I am trying to upload files using Django's ImageField and forms everytime I click submit on the form. 我每次单击表单上的提交时都尝试使用Django的ImageField和表单上载文件。 The form.is_valid returns false So I printed forms.errors It says form.is_valid返回false,所以我打印了forms.errors它说

photo2
This field is required.

photo1
This field is required.

I select the image files I want to upload and it still says field is required. 我选择了要上传的图像文件,仍然显示必填字段。

Here is view of my settings.py 这是我的settings.py的视图

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

Here is views.py 这是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})

Here is my models.py 这是我的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 UploadForm(forms.ModelForm): forms.py类UploadForm(forms.ModelForm):

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

and in my template I am just using 在我的模板中,我只是使用

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

Thank you for help in advance. 预先感谢您的帮助。 I can upload forms.py if needed. 如果需要,我可以上传forms.py。

You need to provide the form markup in the template as it is not included when rendering {{ form }} : 您需要在模板中提供表单标记,因为呈现{{ form }}时不包含该表单标记:

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

The enctype="multipart/form-data" is essential when posting files from the form. 从表单发布文件时, enctype="multipart/form-data"是必不可少的。 See the docs on forms in general and those on file uploads in particular: 请参阅有关表单文档 ,尤其是有关文件上传文档

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". 请注意,仅当请求方法为POST并且发布请求的表单具有属性enctype =“ multipart / form-data”时,request.FILES仅包含数据。 Otherwise, request.FILES will be empty. 否则,request.FILES将为空。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM