我遇到了How to create object from QueryDict in django?,它回答了我想要做的事情。但是我想要清理数据。 Brandon通过“使用ModelForm”对发布的数据进行消毒来表示什么?
答案 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
基本上,您可以使用clean
和clean_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