即使在清除方法覆盖

时间:2015-08-12 07:18:03

标签: python django django-models django-forms

我有一个限制小数位数的模型:

lat = models.DecimalField(max_digits=8, decimal_places=5, null=True, blank=True)

从中我创建了一个ModalForm但是如果他们提交了超过5个位置的内容,我想限制小数位数。所以我做了一个自定义的清理方法:

def clean_lat(self):
    lat = self.cleaned_data['lat']
    return round(lat, 4)

但它仍然会引发ValidationError,我有更多小数位,然后允许。我做错了什么?

2 个答案:

答案 0 :(得分:2)

有两种方法可以解决这个问题。

首先要覆盖你的模型init方法

def __init__(self, *args, **kwargs):
    super(TestForm, self).__init__(*args, **kwargs)
    self.fields['lat'].decimal_places = None
    self.fields['lat'].max_digits = None

这将禁用modelform的小数位和最大数字验证。然后,您的clean_lat方法应确保确保表单数据验证。模型仍然会截断/舍入/验证小数值。

第二个选项是从模型中删除max_digits=8, decimal_places=5并确保在表单clean_lat方法中进行验证。如果在不使用ModelForm的情况下保存对象,则会产生问题。

答案 1 :(得分:-4)

form.is_valid方法做了一件非常简单的事情:

use strict;
use File::Find;
find({ wanted => \&processFile,}, '.');
sub processFile{
        print $File::Find::name, "\n";
}

我建议你进入源代码(django / forms / forms.py),原因很快就会找到。