文章目录
- 代码目录结构
- 逻辑代码
- forms.py
- views.py
代码目录结构
逻辑代码
只展示与 form 不同的代码
forms.py
from django import forms
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from app01 import models
# 写一个核 Model 类一一对应的 form
class BookModelForm(forms.ModelForm):
class Meta:
model = models.Book
fields = "__all__" # fields = ["title"]
labels = {
"title": "书名",
"publisher": "出版社",
"authors": "作者",
}
widgets = {
"title": forms.widgets.TextInput(attrs={"class": "form-control"}),
"publisher": forms.widgets.Select(attrs={"class": "form-control"}),
"authors": forms.widgets.SelectMultiple(attrs={"class": "form-control"}),
}
# 钩子函数(hook) clean_字段
def clean_title(self):
# 从处理后的数据中拿到 title 的值
v = self.cleaned_data.get("title")
if "alex" in v:
raise ValidationError("包含敏感词 alex")
else:
return v
# 自定义的校验规则函数
def phone_validate(v):
# 用用户填写的手机号去数据库查找
is_exist = models.Author.objects.filter(phone=v)
if is_exist:
# 如果已经存在, 就不能注册
raise ValidationError("该手机号已经注册")
else:
return v
class AuthorModelForm(forms.ModelForm):
class Meta:
model = models.Author
fields = "__all__"
labels = {
"name": "姓名",
"age": "年龄",
"phone1": "联系方式 1",
"phone2": "联系方式 2",
}
widgets = {
"name": forms.widgets.TextInput(attrs={"class": "form-control"}),
"age": forms.widgets.TextInput(attrs={"class": "form-control"}),
"phone1": forms.widgets.TextInput(attrs={"class": "form-control"}),
# 为了展示, 使用的 PasswordInput, 这个字段编辑时不会显示内容
"phone2": forms.widgets.PasswordInput(attrs={"class": "form-control"}),
}
# 全局钩子
def clean(self):
# 可以取到 cleaned_data 中所有的数据进行对比校验
phone1 = self.cleaned_data.get("phone1")
phone2 = self.cleaned_data.get("phone2")
if phone1 == phone2:
# self.add_error("字段", "密码和确认密码不一致"), 这个是定义报错信息的位置
self.add_error("phone2", "两次电话号码相同")
views.py
from django.shortcuts import render, redirect, HttpResponse
from app01 import models
from django import views
from app01.forms import AuthorModelForm, BookModelForm
# Create your views here.
def book_list(request):
data = models.Book.objects.all()
return render(request, "book_list.html", {"data": data})
class BookAdd(views.View):
def get(self, request):
# 这里使用 BookModelForm 实例化
book_obj = BookModelForm()
return render(request, "book_add.html", {"book_obj": book_obj})
def post(self, request):
# 如果只传 request.POST, 调用 save() 方法时表示新建
book_obj = BookModelForm(request.POST)
# 检验, 这个是内置的
if book_obj.is_valid():
book_obj.save()
return redirect('/book_list/')
else:
return render(request, "book_add.html", locals())
def book_del(request, id):
models.Book.objects.filter(id=id).first().delete()
return redirect("/book_list/")
class BookEdit(views.View):
def get(self, request, id):
# 这里使用参数 instance 指定需要修改的 orm_obj
rec = models.Book.objects.filter(id=id).first()
book_obj = BookModelForm(instance=rec)
return render(request, "book_edit.html", locals())
def post(self, request, id):
rec = models.Book.objects.filter(id=id).first()
# 如果传了 instance 参数, 再调用 save() 方法表示更新
book_obj = BookModelForm(request.POST, instance=rec)
if book_obj.is_valid():
book_obj.save()
return redirect("/book_list/")
else:
return render(request, "book_edit.html", locals())
def author_list(request):
data = models.Author.objects.all()
return render(request, "author_list.html", {"data": data})
class AuthorAdd(views.View):
def get(self, request):
author_obj = AuthorModelForm()
return render(request, "author_add.html", {"author_obj": author_obj})
def post(self, request):
author_obj = AuthorModelForm(request.POST)
if author_obj.is_valid():
author_obj.save()
return redirect("/author_list/")
else:
return render(request, "author_add.html", locals())
def author_del(request, id):
models.Author.objects.filter(id=id).first().delete()
return redirect("/author_list/")
class AuthorEdit(views.View):
def get(self, request, id):
rec = models.Author.objects.filter(id=id).first()
author_obj = AuthorModelForm(instance=rec)
return render(request, "author_edit.html", locals())
def post(self, request):
rec = models.Author.objects.filter(id=id).first()
# 如果传了 instance 参数, 表示更新
author_obj = AuthorModelForm(request.POST, instance=rec)
if author_obj.is_valid():
author_obj.save()
return redirect("/author_list/")
else:
return render(request, "author_edit.html", locals())