0
点赞
收藏
分享

微信扫一扫

Django 之 练习5: ModelForm



文章目录

  • 代码目录结构
  • 逻辑代码
  • forms.py
  • views.py


代码目录结构

Django 之 练习5: ModelForm_字段

逻辑代码

只展示与 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())


举报

相关推荐

0 条评论