我正在尝试学习Django,我正在阅读此链接: https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/
如果您在提供的链接中向下滚动,则表示验证表单涉及两个主要步骤,第一步是“验证表单”,这将导致此链接: https://docs.djangoproject.com/en/1.5/ref/forms/validation/#form-and-field-validation
它说每次验证的第一步是在字段上使用to_python()方法。我不明白他们说什么时的意思
“它强制修改数据类型的值并在不可能的情况下引发ValidationError。此方法接受窗口小部件的原始值并返回转换后的值。”
假设我有这样的模型
class User(models.Model):
user_id = models.AutoField(unique=True, primary_key=True)
username = models.SlugField(max_length=50, unique=True)
first_name = models.CharField(max_length=50)
我创建了一个像这样的表单
class UserForm(forms.ModelForm):
class Meta:
model = User
现在,我究竟如何使用to_python()方法?我在视图中使用它吗?或者我必须在forms.py文件中使用它?如果我在视图中使用它,该函数会被调用什么?
答案 0 :(得分:3)
Django会自动验证和反序列化字段输入。
发布表单时的示例视图:
def my_view(request):
form = UserForm()
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid(): # here to_python() is run for each field
form.save()
# redirect
return render_to_response('home.html', { 'form': form })
答案 1 :(得分:0)
除非您要创建custom field,否则无需担心to_python()
。如果要使用ModelForm创建简单表单,可以使用clean方法。
如果您只想验证一个字段,可以执行以下操作:
class UserForm(forms.ModelForm):
def clean_username(self):
username = self.cleaned_data['username']
if len(username) > 10:
raise forms.ValidationError("Please shorten your username")
# Always return the cleaned data, whether you have changed it or
# not.
return username
如果要清理多个字段,可以执行以下操作:
class Userform(forms.Form):
# Everything as before.
...
def clean(self):
cleaned_data = super(UserForm, self).clean()
username = cleaned_data.get("username")
first_name = cleaned_data.get("first_name")
if len(username) > 10:
raise forms.ValidationError("Please shorten your username")
if len(first_name) < 1:
raise forms.ValidationError("First name is too short")
# Always return the full collection of cleaned data.
return cleaned_data