文章目录
- 代码目录结构
- 逻辑代码
- 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())                









