I am trying to validate a form using django forms. I have the following model:
class Session(models.Model):
# id = AutoField(primary_key=True) added automatically.
sport = models.ForeignKey('Sport', unique=False, blank=False, null=False, to_field='sport', on_delete=models.CASCADE, )
hostplayer = models.ForeignKey(User, unique=False, blank=False, null=False, on_delete=models.CASCADE, related_name='member_host', )
guestplayer = models.ForeignKey(User, unique=False, blank=True, null=True, on_delete=models.CASCADE, related_name='member_guest', )
date = models.DateField(blank=False, null=False, )
time = models.TimeField(blank=False, null=False, )
city = models.ForeignKey('City', unique=False, blank=False, null=False, to_field='city', on_delete=models.CASCADE, )
location = models.CharField(max_length=64, unique=False, blank=False, null=False, )
price = models.FloatField(unique=False, blank=False, null=False, default=0, )
details = models.TextField(unique=False, blank=True, null=True, )
def __unicode__(self):
return unicode(self.id)
and the following form:
class CreateSessionForm(forms.Form):
sport = forms.CharField()
date = forms.DateTimeField()
time = forms.TimeField()
city = forms.CharField()
location = forms.CharField()
price = forms.FloatField(required=False, initial=0, )
details = forms.CharField(required=False, )
def clean_price(self):
prc = self.cleaned_data['price']
if prc is None:
return 0
return prc
There is some frontend validation but I want to use the is_valid()
funtionality as well. I have the following piece of code in views.py
:
if request.method == "POST":
form = CreateSessionForm(data = request.POST)
if form.is_valid():
# Create session object.
session = Session.objects.create(sport=Sport.objects.get(sport = form['sport'].data), hostplayer = request.user, guestplayer = None,
date = form['date'].data, time = form['time'].data, city = City.objects.get(city=form['city'].data),
>>> location = form['location'].data, price = form['price'].data, details = form['details'].data)
session.save()
# Return to the session page if successful.
return HttpResponseRedirect('/session/' + str(session.id) + '/')
Everything is working fine, except when the price I receive is ''
. I want to allow this and default to 0
. However, I receive the following error on the line marked with >>>
:
could not convert string to float
When debugging that line, it appears that the value of price
in form
does not get updated (it appears to be ''
).
How could I change the value of price in the form to 0
when ''
is passed? What would be the best way to go about doing this?
I have been searching for a way to fix this for 3 hours now without success. This is the first time I am using forms in django so I may very well be missing something completely obvious.
Any help will be greatly appreciated.
Fetch the values from form.cleaned_data
, instead of using form['fieldname'].data
For example:
date = form.cleaned_data['date']
See the docs on processing the data from a form for further details.
There might be more than one problem, but the most obvious one that stands out is this:
price = modes.FloatField(..., blank=False, ...)
in your Session model.
Set blank=True to allow the form field to be blank. The ORM will then use your default=0 when saving if the form field was blank.
I am trying to validate a form using django forms. I have the following model:
class Session(models.Model):
# id = AutoField(primary_key=True) added automatically.
sport = models.ForeignKey('Sport', unique=False, blank=False, null=False, to_field='sport', on_delete=models.CASCADE, )
hostplayer = models.ForeignKey(User, unique=False, blank=False, null=False, on_delete=models.CASCADE, related_name='member_host', )
guestplayer = models.ForeignKey(User, unique=False, blank=True, null=True, on_delete=models.CASCADE, related_name='member_guest', )
date = models.DateField(blank=False, null=False, )
time = models.TimeField(blank=False, null=False, )
city = models.ForeignKey('City', unique=False, blank=False, null=False, to_field='city', on_delete=models.CASCADE, )
location = models.CharField(max_length=64, unique=False, blank=False, null=False, )
price = models.FloatField(unique=False, blank=False, null=False, default=0, )
details = models.TextField(unique=False, blank=True, null=True, )
def __unicode__(self):
return unicode(self.id)
and the following form:
class CreateSessionForm(forms.Form):
sport = forms.CharField()
date = forms.DateTimeField()
time = forms.TimeField()
city = forms.CharField()
location = forms.CharField()
price = forms.FloatField(required=False, initial=0, )
details = forms.CharField(required=False, )
def clean_price(self):
prc = self.cleaned_data['price']
if prc is None:
return 0
return prc
There is some frontend validation but I want to use the is_valid()
funtionality as well. I have the following piece of code in views.py
:
if request.method == "POST":
form = CreateSessionForm(data = request.POST)
if form.is_valid():
# Create session object.
session = Session.objects.create(sport=Sport.objects.get(sport = form['sport'].data), hostplayer = request.user, guestplayer = None,
date = form['date'].data, time = form['time'].data, city = City.objects.get(city=form['city'].data),
>>> location = form['location'].data, price = form['price'].data, details = form['details'].data)
session.save()
# Return to the session page if successful.
return HttpResponseRedirect('/session/' + str(session.id) + '/')
Everything is working fine, except when the price I receive is ''
. I want to allow this and default to 0
. However, I receive the following error on the line marked with >>>
:
could not convert string to float
When debugging that line, it appears that the value of price
in form
does not get updated (it appears to be ''
).
How could I change the value of price in the form to 0
when ''
is passed? What would be the best way to go about doing this?
I have been searching for a way to fix this for 3 hours now without success. This is the first time I am using forms in django so I may very well be missing something completely obvious.
Any help will be greatly appreciated.
Fetch the values from form.cleaned_data
, instead of using form['fieldname'].data
For example:
date = form.cleaned_data['date']
See the docs on processing the data from a form for further details.
There might be more than one problem, but the most obvious one that stands out is this:
price = modes.FloatField(..., blank=False, ...)
in your Session model.
Set blank=True to allow the form field to be blank. The ORM will then use your default=0 when saving if the form field was blank.
0 commentaires:
Enregistrer un commentaire