www.example.com中的django clean函数forms.py不起作用

23c0lvtd  于 2023-05-23  发布在  Go
关注(0)|答案(1)|浏览(186)

我正在阅读一本书,叫做“用Django开发Web”,我很喜欢。其中一件事是,你可以改变一个来自表单的值。我已经测试了引发错误(来自django核心的验证错误),它工作得很好。但是我不能让“clean_name”函数在输入上工作。该功能位于底部。
我希望这里有人知道我做错了什么:)

from django import forms
from django.forms import widgets
from django.core.exceptions import ValidationError

def validate_regnr(value):
    if value[:3].upper() != value[:3]:
        raise ValidationError(f'{value} is not correct')

class BookingForm(forms.Form):

    SERVICES = (
        ('1', 'Årsservice'),
        ('2', 'Storservice'),
        ('3', 'Bromsservice')
    )

    regnr = forms.CharField(min_length=6, max_length=6, validators=[validate_regnr])
    service = forms.ChoiceField(choices=SERVICES)
    name = forms.CharField(max_length=255)
    tel = forms.CharField(max_length=20)
    email = forms.EmailField()
    datetime = forms.DateTimeField(widget=widgets.DateInput(attrs={'type': 'datetime-local'}))
    kommentar = forms.TextInput()

    def clean_name(self):
        value = self.cleaned_data['name']
        return value.upper()
inb24sb2

inb24sb21#

事情的顺序很重要。首先,它将运行在表单字段本身上定义的清理和验证器。然后,它将运行表单中的clean_…方法,最后,它将运行clean方法。
因此,这意味着字段中的验证器在到达clean_name方法之前 * 运行。因此,在字段上定义的验证器不能满足clean_…方法,原因很简单,控制从未传递给这些方法。
但是,您可以在验证之前通过子类化字段来进行清理:

class UppercaseCharField(forms.CharField):
    def to_python(self, value):
        val = super().to_python(value)
        if val is not None:
            return val.upper()

然后用这个:

class BookingForm(forms.Form):
    # …
    regnr = UpperCharField(
        min_length=6, max_length=6, validators=[validate_regnr]
    )
    # no clean_name …

相关问题