使用ModelForm来清理Django中的帖子数据

时间:2016-07-28 18:36:51

标签: python django

我遇到了How to create object from QueryDict in django?,它回答了我想要做的事情。但是我想要清理数据。 Brandon通过“使用ModelForm”对发布的数据进行消毒来表示什么?

2 个答案:

答案 0 :(得分:6)

当您只想创建模型实例时,

ModelForm非常有用。如果您创建一个看起来像模型的表单,那么您应该转而使用模型表单。这是一个例子。 按照Django website中提供的示例进行操作。

在您的forms.py

class ArticleForm(ModelForm):
    class Meta: 
        model = Articels #You need to mention the model name for which you want to create the form
        fields = ['content', 'headline'] #Fields you want your form to display

因此,在表单中,您也可以清理数据。有两种方法可以做到这一点。

方式1:使用Django提供的clean函数,您可以使用该函数清理一个函数中的所有字段。

class ArticleForm(ModelForm):
    class Meta: 
        model = Articels #You need to mention the model name for which you want to create the form
        fields = ['content', 'headline'] #Fields you want your form to display

    def clean(self):
        # Put your logic here to clean data


方式2 :使用clean_fieldname函数,您可以使用该函数分别清理每个字段的表单数据。

class ArticleForm(ModelForm):
    class Meta: 
        model = Articels #You need to mention the model name for which you want to create the form
        fields = ['content', 'headline'] #Fields you want your form to display

    def clean_content(self):
        # Put your logic here to clean content

    def clean_headline(self):
        # Put your logic here to clean headline

基本上,您可以使用cleanclean_fieldname方法来验证表单。这样做是为了在提交错误输入时引发表单中的任何错误。我们假设您希望文章内容至少包含10个字符。您可以将此约束添加到clean_content

class ArticleForm(ModelForm):
    class Meta: 
        model = Articels #You need to mention the model name for which you want to create the form
        fields = ['content', 'headline'] #Fields you want your form to display

    def clean_content(self):
        # Get the value entered by user using cleaned_data dictionary
        data_content = self.cleaned_data.get('content')

        # Raise error if length of content is less than 10
        if len(data_content) < 10:
            raise forms.ValidationError("Content should be min. 10 characters long")

        return data_content

所以这里有流程:
第1步:用户打开页面说/home/,然后向用户显示添加新文章的表单。

第2步:用户提交表单(内容长度小于10)。

第3步:您使用POST数据创建表单实例。像这样form = ArticleForm(request.POST)

第4步:现在,您可以在表单上调用is_valid方法来检查其是否有效。

第5步:现在clean_content正在发挥作用。当您致电is_valid时,它会检查用户输入的内容是否为分钟。 10个字符与否。如果不是,则会引发错误。

这是验证表单的方法。

答案 1 :(得分:1)

他的意思是,使用ModelForm,您不仅可以从QueryDict创建模型实例,还可以对数据类型及其要求进行一系列验证,例如,如果值为& #39;长度正确,如果需要等等。此外,您只需将QueryDict所需的数据传递给模型实例,而不是整个请求

因此,典型的流程是:

form = ModelForm(request.POST)
if form.is_valid():
    form.save()
    return HttpResponse('blah-blah success message')
else:
    form = ModelForm()
    return HttpResponse('blah-blah error message')

令人敬畏的Django文档为此:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#django.forms.ModelForm