Django的forms.ModelForm自定义特殊条件认证。
class ProfileForm(forms.ModelForm): class Meta: model = Profile fields = '__all__' def clean_max_distance(self): # 方法的名字必须clean开头 cleaned = super().clean() if cleaned['max_distance'] < cleaned['min_distance']: raise forms.ValidationError(u'max_distance必须要大于min_distance') # raise输出错误 else: return cleaned['max_distance'] def clean_max_dating_age(self): cleaned = super().clean() if cleaned['max_dating_age'] < cleaned['min_dating_age']: raise forms.ValidationError(u'max_dating_age必须要大于min_dating_age') else: return cleaned['max_dating_age'] # 必须把比较过的值返回
api里面的函数如下,同过调用forms对象的errs输出相关不符合条件的信息,输出形式为dict形式
def set_profile(request): '''修改个人资料,及交友资料''' user = request.user user_form = UserForm(request.POST) if user_form.is_valid(): user.__dict__.update(user_form.cleaned_data) # 跟新对象数据 user.save() else: return render_json(data=user_form.errors, code=stat.UserDataErr) profile_form = ProfileForm(request.POST) if profile_form.is_valid(): '''通过本地保存,减少数据库的一次查询,user_form应该也可以用这种方法。''' profile = profile_form.save(commit=False) # 先本地缓存过滤后的正确数据 profile.id = user.id # 通过ID修改确保数据一直 profile.save() # 保存数据到数据库 else: return render_json(data=profile_form.errors,code=stat.ProfileDataErr)