django Form的增删改查:一些细节,和无法提交数据的情况解决方法

def phone_list(request):
    # 获取数据库的信息, 并且按照数据库中的价格列表从大到小的排列
    phone_info = models.PrettyNum.objects.all().order_by("-price")
    return render(request, "phone_list.html", {"phone_info": phone_info})

查询其实没有什么可以说的,就很简单

删 

def phone_del(request, phone_id):
    models.PrettyNum.objects.filter(id=phone_id).delete()
    return redirect("/phone_list/")

同上述的一样,就是基本的操作

class PrettyModelForm(forms.ModelForm):
    # able : 能力 :disable:是残疾地,使无效
    # 在这里重新定义mobile字段,使其不可以该
    # mobile 字段被重新定义为一个 CharField 类型的表单字段,并且被设置为 disabled=True。这意味着在表单中,该字段将呈现为禁用状态,用户无法编辑或输入值
    # 。同时,通过 label="手机号" 设置了该字段的标签为“手机号”。
    # # 在这里可以编写一些自己需要的字段来替换以前数据表中的。比如格式的规范,正则表达式
    # mobile = forms.CharField(  # 定义的一个Django里面的字段
    #     label="手机号",
    #     validators=[
    #         RegexValidator(
    #             regex="^1[3-9]/d{9}$",
    #             message="手机号码格式错误"
    #         )
    #     ]
    # )

    class Meta:
        # 指定该表单对应的模型。这将自动创建一个表单,其中包含了模型中定义的字段,并且可以通过该表单来对模型的实例进行创建、更新和删除操作。
        model = models.PrettyNum
        fields = '__all__'

        # 构造函数,并调用父类函数

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # 通过循环遍历 self.fields.items(),即模型表单中的所有字段及其对应的字段对象
        for name, field in self.fields.items():
            # 再浏览器显示时,HTML网页中按字段类型使用默认标签 ,
            # 如果要使用指定类型; field.widgets.TextInput.attrs = {"class": "form-control", "placeholder": field.label}
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}

        # 使用函数的方法,对数据进行校验

    class PrettyModelForm(forms.ModelForm):
        def clean_mobile(self):
            # 获取用户提交的手机号码数据
            txt_mobile = self.cleaned_data['mobile']

            # 定义手机号码的正则表达式模式
            pattern = r"^1[3-9]\d{9}$"

            # 使用 re 模块的 match 方法来检查手机号码是否匹配模式
            if not re.match(pattern, txt_mobile):
                # 如果手机号码格式不正确,抛出 ValidationError 异常并提供错误消息
                raise forms.ValidationError("手机号码格式错误")

            # 如果手机号码格式正确,获取数据库里面的电话,之前匹配。看看是否已经存在

            # 获取手机号码记录
            mobile_info = models.PrettyNum.objects.filter(mobile=txt_mobile).first()

            # 检查手机号码记录是否存在
            if mobile_info.mobile:
                raise forms.ValidationError("该手机号码已经存在,请更换。或联系管理员清除该手机号码")

            return txt_mobile


def phone_add(request):
    if request.method == "POST":
        # 当用户提交表单时,通过 request.POST 将用户提交的 POST 数据传递给PrettyModelForm(),从而创建一个带有用户提交数据的表单实例。
        form = PrettyModelForm(data=request.POST)
        # 这个是对输入的的校验
        if form.is_valid():
            form.save()
            return redirect('/phone_list/')

        else:
            return render(request, 'phone_add.html', {"form": form})

    form = PrettyModelForm()
    return render(request, 'phone_add.html', {"form": form})

在增加数据的时候,有的数据增加会涉及到格式的。比如要用正则表达式。会比较复杂

因为我添加电话:有固定的格式,需要用正则表达来固定输入格式;方法有二:

一:使用函数 

def clean_mobile(self):
            # 获取用户提交的手机号码数据
            txt_mobile = self.cleaned_data['mobile']

            # 定义手机号码的正则表达式模式
            pattern = r"^1[3-9]\d{9}$"

            # 使用 re 模块的 match 方法来检查手机号码是否匹配模式
            if not re.match(pattern, txt_mobile):
                # 如果手机号码格式不正确,抛出 ValidationError 异常并提供错误消息
                raise forms.ValidationError("手机号码格式错误")

            # 查询数据库,检查手机号码是否已存在
            mobile_info = models.PrettyNum.objects.filter(mobile=txt_mobile).first()

            if mobile_info:
                raise forms.ValidationError("该手机号码已经存在,请更换或联系管理员清除该手机号码")

            return txt_mobile

二:直接使用正则表达式(使用RegexValidator类)

from django.core.validators import RegexValidator

validators=[
            RegexValidator(
                regex="^1[3-9]/d{9}$",
                message="手机号码格式错误"
            )

但是直接使用正则表达式,固然方便但是它无法验证这个电话号码是否已经在数据库中存在。无法进行其他的校验(不是没有办法吧,只是说比较困难。没有函数方便)

细节一:

在使用字段清理方法的时候;要注意,如果你是这样写的话。肯定会出错

        def clean_mobile(self):
            # 获取用户提交的手机号码数据
            txt_mobile = self.cleaned_data['mobile']

            # 定义手机号码的正则表达式模式
            pattern = r"^1[3-9]\d{9}$"

            # 使用 re 模块的 match 方法来检查手机号码是否匹配模式
            if not re.match(pattern, txt_mobile):
                # 如果手机号码格式不正确,抛出 ValidationError 异常并提供错误消息
                raise forms.ValidationError("手机号码格式错误")

            # 如果手机号码格式正确,获取数据库里面的电话,之前匹配。看看是否已经存在

            # 获取手机号码记录
            mobile_info = models.PrettyNum.objects.filter(mobile=txt_mobile).first()

            # 检查手机号码记录是否存在
            if mobile_info.mobile:
                raise forms.ValidationError("该手机号码已经存在,请更换。或联系管理员清除该手机号码")

            return txt_mobile

报错:

虽然我不知道,这是为什么。但是我的怎么解决,如果有人知道为什么,非常欢迎,来告诉我

 解决:

    class PrettyModelForm(forms.ModelForm):
        def clean_mobile(self):
            # 获取用户提交的手机号码数据
            txt_mobile = self.cleaned_data['mobile']

            # 定义手机号码的正则表达式模式
            pattern = r"^1[3-9]\d{9}$"

            # 使用 re 模块的 match 方法来检查手机号码是否匹配模式
            if not re.match(pattern, txt_mobile):
                # 如果手机号码格式不正确,抛出 ValidationError 异常并提供错误消息
                raise forms.ValidationError("手机号码格式错误")

            # 如果手机号码格式正确,获取数据库里面的电话,之前匹配。看看是否已经存在

            # 获取手机号码记录
            mobile_info = models.PrettyNum.objects.filter(mobile=txt_mobile).first()

            # 检查手机号码记录是否存在
            if mobile_info.mobile:
                raise forms.ValidationError("该手机号码已经存在,请更换。或联系管理员清除该手机号码")

            return txt_mobile

在上面加一个类,虽然字段清理的方法本来就在class PrettyModelForm(forms.ModelForm):这个类的里面


class PrettyEditModelForm(forms.ModelForm):
    mobile = forms.CharField(disabled=True, label="手机号")

    # able : 能力 :disable:是残疾地,使无效
    # 在这里重新定义mobile字段,使其不可以该
    # mobile 字段被重新定义为一个 CharField 类型的表单字段,并且被设置为 disabled=True。这意味着在表单中,该字段将呈现为禁用状态,用户无法编辑或输入值
    # 。同时,通过 label="手机号" 设置了该字段的标签为“手机号”。

    # # 在这里可以编写一些自己需要的字段来替换以前数据表中的。比如格式的规范,正则表达式
    # mobile = forms.CharField(  # 定义的一个Django里面的字段
    #     label="手机号",
    #     validators=[
    #         RegexValidator(
    #             regex="^1[3-9]/d{9}$",
    #             message="手机号码格式错误"
    #         )
    #     ]
    # )

    class Meta:
        # 指定该表单对应的模型。这将自动创建一个表单,其中包含了模型中定义的字段,并且可以通过该表单来对模型的实例进行创建、更新和删除操作。
        model = models.PrettyNum
        fields = '__all__'

        # 构造函数,并调用父类函数

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # 通过循环遍历 self.fields.items(),即模型表单中的所有字段及其对应的字段对象
        for name, field in self.fields.items():
            # 再浏览器显示时,HTML网页中按字段类型使用默认标签 ,
            # 如果要使用指定类型; field.widgets.TextInput.attrs = {"class": "form-control", "placeholder": field.label}
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}


def phone_edit(request, phone_id):
    # 获取用户要编辑的id
    # 这时候还是没有编辑的信息
    edit_info = models.PrettyNum.objects.filter(id=phone_id).first()

    if request.method == "POST":
        # instance 将数据进行替换
        # instance=edit_info这个是以及修改的信息
        form = PrettyEditModelForm(data=request.POST, instance=edit_info)
        if form.is_valid():
            form.save()
            return redirect("/phone_list/")
    else:
        form = PrettyEditModelForm(instance=edit_info)

    return render(request, 'phone_edit.html', {"form": form, "edit_info": edit_info})

在改的时候,可以继续使用在增的时候定义的类,但使用相同的类的时候,在form表中的数据就是一样的,在改的时候就会改掉全部的数据。

细节二:

但是电话号码是固定的,我们不希望它改变,所以我们要重新来定义一个类,在新类里面来编写一个新的mobile字段来锁定字段

mobile = forms.CharField(disabled=True, label="手机号"):disabled:无效的

有一个非常有意思·的细节。就是编辑和增加使用同一个类的话,你会发现编辑后的数据一直无法提交。这个问题困扰了我整整一天。我修改html修改视图函数,都一直没有办法解决,直到我发现重新定义一个类单独给编辑使用,便可以解决。虽然这个办法可能不是很好。(如果有其他方法,非常欢迎留言)

细节三:

如果我们想在编辑中更换自己手机号。

mobile_info = models.PrettyNum.objects.filter(mobile=txt_mobile).exsits()

但是这样写的话。我们在更改其他数据的时候,这个电话号码是不是一直在数据库中存在,由于在之前的字段清理函数中编写了不可以手机号码重复,所以这个数据会一直提交不上去。

我们可以检测排除自己以为是否还有手机号码重复

mobile_info = models.PrettyNum.objects.filter(mobile=txt_mobile).exclude(id=2)

上述代码,就是检测排除id=2的数据。是否存在电话等于text_mobile的一个数据 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中,增删改查操作可以通过Django自带的ORM(对象关系映射)实现。ORM可以将数据库中的表映射成Python中的类,通过操作类和对象来操作数据库。 下面分别介绍四个常用的操作: 1. 增加数据 使用ORM添加数据有两种方式: - 直接实例化模型类对象并调用save()方法保存数据。 ```python from app.models import ModelName obj = ModelName(name='John', age=20) obj.save() ``` - 使用模型类的objects.create()方法创建并保存对象。 ```python from app.models import ModelName obj = ModelName.objects.create(name='John', age=20) ``` 2. 查询数据 使用ORM查询数据有以下几种方式: - 查询所有数据: ```python from app.models import ModelName objs = ModelName.objects.all() ``` - 根据条件查询数据: ```python from app.models import ModelName objs = ModelName.objects.filter(name='John') ``` - 获取单个对象: ```python from app.models import ModelName obj = ModelName.objects.get(pk=1) ``` 3. 更新数据 使用ORM更新数据有以下几种方式: - 直接修改模型类对象的属性并调用save()方法保存数据。 ```python from app.models import ModelName obj = ModelName.objects.get(pk=1) obj.name = 'Tom' obj.save() ``` - 使用update()方法批量更新数据。 ```python from app.models import ModelName ModelName.objects.filter(name='John').update(name='Tom') ``` 4. 删除数据 使用ORM删除数据有以下几种方式: - 删除单个对象: ```python from app.models import ModelName obj = ModelName.objects.get(pk=1) obj.delete() ``` - 根据条件批量删除数据: ```python from app.models import ModelName ModelName.objects.filter(name='John').delete() ``` 以上是Django增删改查的常用方法。当然,ORM还有其他更高级的查询方法,可以根据自己的需求进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值