我正在阅读一本书,叫做“用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()
1条答案
按热度按时间inb24sb21#
事情的顺序很重要。首先,它将运行在表单字段本身上定义的清理和验证器。然后,它将运行表单中的
clean_…
方法,最后,它将运行clean
方法。因此,这意味着字段中的验证器在到达
clean_name
方法之前 * 运行。因此,在字段上定义的验证器不能满足clean_…
方法,原因很简单,控制从未传递给这些方法。但是,您可以在验证之前通过子类化字段来进行清理:
然后用这个: