web项目 day03(四)

set_profile接口

对form表单提交上来的内容进行数据的更新,首先得验证提交上来的内容的有效性,是否符合数据库中的字段

第一篇文章中提到了Django 中的 Form 表单验证
首先了解一下其中代码的功能

Django 中的 Form 表单验证

  1. 首先去模拟创建From模型
    在这里插入图片描述
  2. 然后用POST模拟表单的提交
    在这里插入图片描述
  3. 使用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__'

输入错误的和正常的逻辑测试一下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值