django 表单:无法将字符串转换为浮点数
我正在尝试使用 Django 表单来验证一个表单。我有以下这个模型:
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)
还有这个表单:
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
虽然前端有一些验证,但我也想使用 is_valid()
这个功能。我在 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) + '/')
一切都运行得很好,除了当我收到的价格是 ''
(空字符串)时。我想允许这个情况,并将其默认设置为 0
。但是,在标记为 >>>
的那一行,我收到了以下错误:
could not convert string to float
在调试那一行时,我发现 form
中的 price
值没有更新(它似乎还是 ''
)。
我该如何在传入 ''
时,将表单中的价格值改为 0
?这样做的最佳方法是什么?
我已经搜索了三小时想要解决这个问题,但没有成功。这是我第一次在 Django 中使用表单,所以我可能遗漏了一些非常明显的东西。
任何帮助都将非常感激。
2 个回答
0
可能有不止一个问题,但最明显的问题是:
price = modes.FloatField(..., blank=False, ...)
在你的 Session 模型里。
把 blank=True 设置上,这样表单字段就可以留空了。如果表单字段是空的,ORM(对象关系映射)在保存的时候会用你设置的默认值 0。
2
从 form.cleaned_data
中获取值,而不是使用 form['fieldname'].data
举个例子:
date = form.cleaned_data['date']
想了解更多细节,可以查看关于 处理表单数据 的文档。