uploading image using ImageField in Django

时间:2018-06-18 11:41:51

标签: python django django-forms imagefield

I am trying to upload files using Django's ImageField and forms everytime I click submit on the form. The form.is_valid returns false So I printed forms.errors It says

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

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

Here is 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

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):

    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.

1 个答案:

答案 0 :(得分:0)

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

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

从表单发布文件时,enctype="multipart/form-data"是必不可少的。请参阅docs on forms in general以及特别是file uploads上的内容:

  

请注意,如果请求方法是POST,则request.FILES将仅包含数据,并且发布请求的表单具有属性enctype =&#34; multipart / form-data&#34;。否则,request.FILES将为空。