Reputation: 1943
I have a problem with my app. A pet store app.
I created 2 forms . The First form allow users to create their own store and save the data into the models which I did successfully and the second form allows users to add their own pets to the pet store.
The first form was successful because it got validated correctly but my second form didn't succeed the validation because in PetForm , I have a field called image = forms.FileField() where users can upload a picture of their pet and the validation fail because the picture does not save anywhere.
I tried to put in an argument into image = forms.FileField(upload_to="images/") but I received an error
__init__() got an unexpected keyword argument 'upload_to'
I'm reading the documentation at the moment and it state ' When you I use FileField in a form, you must also remember to bind the file data to the form.'.
I'm having trouble understanding binding the file data .
Can someone please help me !
My forms.py
from django import forms
from pet.models import Store
from pet.models import Pet
class StoreForm(forms.ModelForm):
name = forms.CharField(max_length =20,widget =forms.Textarea)
number = forms.CharField(max_length =20,widget =forms.Textarea)
address = forms.CharField(max_length = 20,widget = forms.Textarea)
class Meta:
model = Store
fields = ('name','number','address')
class PetForm(forms.ModelForm):
animal =forms.CharField(max_length = 20,widget = forms.Textarea)
description =forms.CharField(max_length =20, widget = forms.Textarea)
owner = forms.ModelChoiceField(queryset=Store.objects.all())
image = forms.FileField()
class Meta:
model = Pet
fields = ('animal','description','owner','image')
My models.py
from django.db import models
class Store(models.Model):
name = models.CharField(max_length = 20)
number = models.BigIntegerField()
address =models.CharField(max_length = 20)
def __unicode__(self):
return self.name
class Pet(models.Model):
animal = models.CharField(max_length =20)
description = models.TextField()
owner = models.ForeignKey(Store)
image = models.FileField(upload_to="images/",blank=True,null=True)
def __unicode__(self):
return self.animal
This is parts of my views.py
import from django.core.files.uploadedfile import SimpleUploadedFile
def fan(request): # this is the function that saves my form into my models.
form = PetForm(request.POST or None)
if form.is_valid():
dad = form.save(commit=False)
dad.save()
if 'cat' in request.POST:
cat = request.POST['next']
else:
cat = reverse('world:index')
return HttpResponseRedirect(cat)
return render_to_response(
'fan.html',
{'form':PetForm()},
context_instance = RequestContext(request)
)
and My fan.html
<form method="POST" "action">{% csrf_token %}
<ul>
{{ form.as_ul }}
</ul>
<input type = "submit" value= "Add Pets to Store" />
</form>
Upvotes: 2
Views: 4611
Reputation: 22808
Because your override your Pet model image. Delete the image in your form.
class PetForm(forms.ModelForm):
animal =forms.CharField(max_length = 20,widget = forms.Textarea)
description =forms.CharField(max_length =20, widget = forms.Textarea)
owner = forms.ModelChoiceField(queryset=Store.objects.all())
class Meta:
model = Pet
fields = ('animal','description','owner','image')
//It's not necessary to defined again model field in the form. Once you call the model
//in the form it's understood what you want to show. You can only defined the model
//field again if you want something to add or embed in that field. Like for example you
//want to change the charfield in to textarea or you defined a queryset like you did
//above. Erase your max_length because you are already defined that in the model.
When you upload images don't forget to add "multipart/form-data" in the form
<form method="POST" enctype="multipart/form-data" "action" >
{% csrf_token %}
<ul>
{{ form.as_ul }}
</ul>
<input type = "submit" value= "Add Pets to Store" />
</form>
Upvotes: 3