I want to save 400 picture to my Image model using one single file field and i dont know how tp get each image from the form and create an instance on the Image model
here is my model function:
class Image(models.Model):
image = models.ImageField(null=True, blank=True)
and here is my form:
class AddImageForm(forms.ModelForm):
image = forms.FileField(widget=forms.FileInput(attrs={'class':'form-control','multiple':'true'}))
class Meta:
model = Image
fields = ['image']
and here is my view which i know is wrong just to make sure i share everything:
def imagesform(request):
form = AddImageForm()
if request.method == 'POST':
if form.is_valid():
for i in form['image']:
Image.objects.create(image=i)
context = {'form':form}
return render(request, 'members/imagesform.html', context)
Multiple file uploads can be a pain to implement, but you're almost there! From what I see, the only thing that's missing is that you should instantiate your form with the request.POST and request.FILES arguments:
def imagesform(request):
if request.method == 'POST':
form = AddImageForm(request.POST, request.FILES)
if form.is_valid():
for i in form['image']:
Image(image=i).save()
form = AddImageForm()
context = {'form':form}
return render(request, 'members/imagesform.html', context)
Also, make you sure you add the attribute enctype="multipart/form-data" to your <form> tag.
Related
Let's say I submit a form to the back-end and I save a record of the model in the following way:
views.py:
def viewName(request):
if request.method == 'POST':
form = ProjectForm(request.POST)
if form.is_valid():
form.save() #I want to get the id of this after it is saved
else:
print (form.errors)
form = ProjectForm()
return render(request, 'index.html', context)
forms.py:
class ProjectForm(ModelForm):
class Meta:
model = Project
fields = '__all__'
Right after saving the form, I would like to get the id of the record for the model.
I tried with form.id and form.pk as I saw in other similar questions without success.
How can I get the id or the pk of the new entry added to the Project model?
form.save() returns the object, so:
obj = form.save()
print(obj.pk)
My Views
def apost(request):
if request.method =='POST':
form = APostForm(request.POST, request.FILES)
if form.is_valid():
form = form.save(commit=False)
form.slug = slugify(form.title)
form.save()
return redirect('apost')
else:
form = APostForm()
template_name = 'dadmin/form.html'
items = Post.objects.all()
context = {'title':'Add Post','form':form,'items':items}
return render (request, template_name, context)
My Form
class APostForm(forms.ModelForm):
class Meta:
model = Post
fields = {'title','photo','content'}
Models
photo = models.ImageField(upload_to='images')
No Image uploaded is Accepted Photo is selected but when Click save. It shows this field is required error. I had searched through the questions here but request.FILES solves others problems but not mines. Whats wrong?
you should use in template where you are uploading form:
<form class="form-horizontal form_middle" enctype='multipart/form-data' method="POST">
#apply logic for media upload
</form>
in views.y, the form you are saving should also have request.FILES
studentProfileForm = StudentRegisterForm(request.POST, request.FILES)
if studentProfileForm.is_valid():
user = studentProfileForm.save()
File upload is a bit weird in model forms in django.
Change your forms.py to -
class APostForm(forms.ModelForm):
photo=forms.FileField(label='Upload image') # or image field
class Meta:
model = Post
fields = {'title','content'}
form.save() will automatically save the field.
I have a ModelForm containing a field: image = models.ImageField:
class InstanceForm(ModelForm):
class Meta:
model = Instance
exclude = ('created_at','author',)
And my view is:
def add_instance(request):
if request.user.is_authenticated():
if request.POST:
form=InstanceForm(request.POST,request.FILES)
if form.is_valid():
new_instance=form.save(commit=False)
new_instance.author=request.user.username
new_instance.save()
locals().update(csrf(request))
return render_to_response(...)
else:
return render_to_response(...)
else:
form=InstanceForm()
return render_to_response(...)
else: return HttpResponse(...)
When my form is not valid it shows not only errors, but field 'image' without path to image. It's working in this way, even if I have chosen image at first using Browse.
I read some documents in Django site such as: Basic file uploads and FileField.storage. However, I still don't understand how to upload a file (or an image) to server and store its link in database. I would like to write the files to the following directory such as: 'image/%Y/%m/%d'
Please give me a sample code. Thank you so much.
My code follows as:
#models.py
class Image(models.Model):
imageid = models.AutoField()
title = models.CharField(max_length=100)
imagepath = models.ImageField(upload_to='images/%Y/%m/%d/')
#forms.py
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=100)
image = forms.FileField()
#views.py
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
# How to upload file to folder named 'images/%Y/%m/%d/'
# How to save the link above to database
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render_to_response('upload.html', {'form': form})
I believe if you create the upload form as a model form and then just save it in the view, it will have the effect of saving the file to the filesystem and the path to the model. This is a basic example, but I think it should work.
# forms.py
class UploadFileForm(forms.ModelForm):
class Meta:
model = models.Image
# views.py
...
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect('/success/url/')
I've looked around at related questions, but none of the answers seem to work. I'm trying to upload a profile image for a user and have it replace (overwrite) the current image. Upon saving the image I want to change the filename to the user id. In it's current form the image will upload, but it won't replace the existing image (e.g. it'll be saved as 2_1.png).
class PhotoForm(forms.ModelForm):
def save(self):
content_type = self.cleaned_data['photo'].content_type.split('/')[-1]
filename = '%d.%s' % (self.instance.user.id, content_type)
instance = super(PhotoForm, self).save(commit=False)
instance.photo = SimpleUploadedFile(filename, self.cleaned_data['photo'].read(), content_type)
instance.save()
return instance
class Meta:
model = UserProfile
fields = ('photo',)
def photo_form(request):
if request.method == 'POST':
form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile())
if form.is_valid():
form.save()
else:
form = PhotoForm()
return render(request, 'photo_form.html', {'form': form})
def photo_form(request):
if request.method == 'POST':
form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile())
if form.is_valid():
handle_uploaded_file(request.FILES['<name of the FileField in models.py>'])
def handle_uploaded_file(f):
dest = open('/path/to/file', 'wb') # write should overwrite the file
for chunk in f.chunks():
dest.write(chunk)
dest.close()
check here: https://docs.djangoproject.com/en/dev/topics/http/file-uploads/
If that doesn't work, I suppose you could just use os.system to delete the file if the form is accepted. That probably wouldn't be that great of a solution, but it should work.