查
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的一个数据