0

我正在尝试学习 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 文件中使用它?如果我在视图中使用它,该函数将被调用什么?

4

2 回答 2

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 })
于 2013-09-19T23:09:39.770 回答
0

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
于 2013-09-20T09:22:04.530 回答