django如何从现有模型创建和使用表单

时间:2013-09-19 22:44:25

标签: python django validation django-models django-forms

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

2 个答案:

答案 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