即使在清除方法重写之后,表单字段仍然会进行错误验证

2024-04-27 00:45:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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,我有更多的小数位,然后允许。我做错什么了?你知道吗


Tags: 模型selftrue内容modelsnullmaxdecimal
2条回答

那个表格.u有效吗方法做一件非常简单的事情:

def full_clean(self):
    """
    Cleans all of self.data and populates self._errors and
    self.cleaned_data.
    """
    self._errors = ErrorDict()
    if not self.is_bound:  # Stop further processing.
        return
    self.cleaned_data = {}
    # If the form is permitted to be empty, and none of the form data has
    # changed from the initial data, short circuit any validation.
    if self.empty_permitted and not self.has_changed():
        return

    self._clean_fields()
    self._clean_form()
    self._post_clean()

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

有两种方法可以解决这个问题。你知道吗

第一种方法是像这样重写modelforminit方法

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,并确保在forms clean_lat方法中进行验证。如果不使用ModelForm保存对象,则会产生问题。你知道吗

相关问题 更多 >