set_profile接口
对form表单提交上来的内容进行数据的更新,首先得验证提交上来的内容的有效性,是否符合数据库中的字段
第一篇文章中提到了Django 中的 Form 表单验证
首先了解一下其中代码的功能
Django 中的 Form 表单验证
- 首先去模拟创建From模型
- 然后用POST模拟表单的提交
- 使用POST实例化from对象,其内部机制会将同名的字段放在一起,
模型中fid字段要求时整型,而POST提交的时字符串类型,name最大长度要求是10,而POST中明显超过了…只有date符合要求,is_valid()这里显示False,表示验证不通过,用errors输出一下错误内容,.cleaned_data输出验证通过的内容
使用Django 中的 Form 表单验证,将同名的字段进行验证,这样就不用写一大堆if…else…进行验证了,而且还能将错误信息列出得很详细
验证字段
和上面介绍的方法类似,但更简便一点
在user文件夹中新建一个forms .py文件,定义一个ProfileForm类,这个类继承forms.ModelForm,继承该类的原因是,该类可以将model和from建立一个关联,这样ProfileForm中model的所有字段,都能使用models .py文件中Prolfile模型的约束关系,该model要使用Profile模型中的哪些字段,需要用一个列表展示出来
forms .py
from django import forms
from user.models import Profile
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
# auto_play 字段不需要做验证
fields = ['location',
'min_distance',
'max_distance',
'min_dating_age',
'max_dating_age',
'dating_sex'
]
# fields = '__all__'
# 该用法是使用Profile中的所有字段的约束关系
set_profile接口
def set_profile(request):
user = request.user
# 通过POST实例化ProfileForm这个类,该接口的功能是更新,所以要接收两个参数,
# data是提交上来的表单数据,instance是需要被更新的内容
form = ProfileForm(data=request.POST, instance=user.profile)
# 如果全部验证通过,则保存该次更新
if form.is_valid():
form.save()
# form内部会将更新的内容保存到数据库
return render_json()
else:
return render_json(data=form.errors)
测试接口,没有问题
功能测试是没有问题,但是细节上有需要修改的地方,比如最小距离比最大距离大;最小匹配年龄比最大匹配年龄小,那么就犯了一个逻辑上的错误,所以代码需要进行完善
forms .py
from django import forms
from user.models import Profile
class ProfileForm(forms.ModelForm):
def clean_max_distance(self):
max_distance = self.cleaned_data.get('max_distance')
min_distance = self.cleaned_data.get('min_distance')
if max_distance < min_distance:
raise forms.ValidationError('最大匹配距离必须大于最小匹配距离')
return max_distance
def clean_max_dating_age(self):
max_dating_age = self.cleaned_data.get('max_dating_age')
min_dating_age = self.cleaned_data.get('min_dating_age')
if max_dating_age < min_dating_age:
raise forms.ValidationError('最大匹配年龄必须大于最小匹配年龄')
return max_dating_age
class Meta:
model = Profile
fields = ['location',
'min_distance',
'max_distance',
'min_dating_age',
'max_dating_age',
'dating_sex'
]
# fields = '__all__'
输入错误的和正常的逻辑测试一下