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.
答案 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将为空。