django 表单:无法将字符串转换为浮点数

1 投票
2 回答
1830 浏览
提问于 2025-04-17 23:03

我正在尝试使用 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']

想了解更多细节,可以查看关于 处理表单数据 的文档。

撰写回答