将views.py中的代码拆分

发布时间 2023-10-19 10:27:59作者: 可可eleven

拆分ModelForm类

在app01/utils下新建form.py,目录不固定

将views.py中编写的ModelForm类拆分出来

form.py

from app01 import models
from django import forms
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from app01.utils.bootstrap import BootStrapModelForm

class UserModelForm(BootStrapModelForm):
    # 设置更多校验,用户名至少为三个字符
    name = forms.CharField(min_length=3, label="用户名")

    class Meta:
        model = models.UserInfo
        # fields返回给前端HTML页面为一个又一个<input...>输入框
        # 后续增加字段只需要在views.py中修改fields = ["name", "password", "age"],前端会自动生成
        # 外键depart只需要写depart,不需要写他自动生成的depart_id
        fields = ["name", "password", "age", "acount", "creata_time", "gender", "depart"]

        # 为fields自动生成的input框添加样式,一个一个添加
        # widgets = {
        #     "name": forms.TextInput(attrs={"class": "form-control"}),
        #     "password": forms.PasswordInput(attrs={"class": "form-control"}),
        # }

        # 为fields自动生成的input框添加样式,一个一个添加比较麻烦,可用:

    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     # 循环找到所有的插件,添加class = "form-control"样式
    #     for name, field in self.fields.items():
    #         # 让某个字段不加form-control样式
    #         # if name == "password":
    #         #     continue
    #
    #         field.widget.attrs = {"class": "form-control", "placeholder": field.label}

class PrettyModelForm(BootStrapModelForm):
    # # #添加手机号的校验规则
    # # 方法一:正则
    # mobile = forms.CharField(
    #     label="手机号",
    #     validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')]
    # )

    class Meta:
        model = models.PrettyNum
        # fields = ["mobile", "price", "level", "status"]表示自定义的字段
        # fields = "__all__"表示所有字段
        # exclude = ['level']表示排除哪个字段
        fields = "__all__"

    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     # 循环找到所有的插件,添加class = "form-control"样式
    #     for name, field in self.fields.items():
    #         # 让某个字段不加form-control样式
    #         # if name == "password":
    #         #     continue
    #
    #         field.widget.attrs = {"class": "form-control", "placeholder": field.label}

    # # 添加手机号的校验规则
    # # #方法二:钩子方法
    # def clean_mobile(self):
    #     txt_mobile = self.cleaned_data["mobile"]
    #
    #     if len(txt_mobile) != 11:
    #         # 验证不通过
    #         raise ValidationError("格式错误")
    #     #验证通过,用户输入的值返回
    #     return txt_mobile


    # 钩子方法
    def clean_mobile(self):
        txt_mobile = self.cleaned_data["mobile"]
        exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
        if exists:
            raise ValidationError("手机号已存在")

        return txt_mobile

class PrettyEditModelForm(BootStrapModelForm):
    # #添加手机号的校验规则
    # 方法一:正则
    mobile = forms.CharField(
        label="手机号",
        validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')]
    )

    #显示mobile,但不可修改
    # mobile = forms.CharField(disabled=True, label="手机号")
    class Meta:
        model = models.PrettyNum
        fields = [ "mobile", "price", "level", "status"]

    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     # 循环找到所有的插件,添加class = "form-control"样式
    #     for name, field in self.fields.items():
    #         # 让某个字段不加form-control样式
    #         # if name == "password":
    #         #     continue
    #
    #         field.widget.attrs = {"class": "form-control", "placeholder": field.label}

    # 钩子方法
    def clean_mobile(self):

        #self.instance.pk当前编辑那一行的ID
        # print(self.instance.pk)

        txt_mobile = self.cleaned_data["mobile"]
        # [手机号不能已在数据库,不能重复]
        # exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
        # exclude(id=self.instance.pk)排除自己ID以外
        #排除自己以外,其他的数据手机号是否重复?
        exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()
        if exists:
            raise ValidationError("手机号已存在")

        return txt_mobile

views.py中导入

from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm

拆分部门管理、用户管理、靓号管理

在app01/新建views文件夹,app01/views/下新建depart.py、pretty.py、user.py分别用于存放部门管理、靓号管理、用户管理的视图函数

将views.py中的视图函数拆分到depart.py、pretty.py、user.py,并将views.py删除

depart.py

from django.shortcuts import render, redirect
from app01 import models
from app01.utils.pagination import Pagination
from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm

# Create your views here.
def depart_list(request):
    """部门列表"""
    # 去数据库中获取所有的部门列表
    # 获取到的数据为queryset类型,[对象,对象,对象]
    queryset = models.Department.objects.all()

    return render(request, 'depart_list.html', {'queryset': queryset})


def depart_add(request):
    """添加部门"""
    if request.method == "GET":
        return render(request, 'depart_add.html')

    # 获取用户POST提交过来的数据
    title = request.POST.get("title")

    # 保存到数据库
    models.Department.objects.create(title=title)

    # 重定向回部门列表
    return redirect("/depart/list/")


def depart_delete(request):
    """删除部门"""
    # 获取ID
    # http://127.0.0.1:8000/depart/delete/?nid=1通过nid传参
    nid = request.GET.get('nid')
    # 删除
    models.Department.objects.filter(id=nid).delete()

    # 跳转回部门列表
    return redirect("/depart/list/")


def depart_edit(request, nid):
    """修改部门"""
    if request.method == "GET":
        # 根据nid, 获取他的数据
        row_object = models.Department.objects.filter(id=nid).first()
        print(row_object.id, row_object.title)
        return render(request, 'depart_edit.html', {'row_object': row_object})

    # 获取用户提交的标题
    title = request.POST.get("title")

    # 根据ID找到数据库中提交的数据并进行更新
    # models.Department.objects.filter(id=nid).update(title=title,其他字段=xxx)
    models.Department.objects.filter(id=nid).update(title=title)

    # 跳转回部门列表
    return redirect("/depart/list/")

pretty.py

from django.shortcuts import render, redirect
from app01 import models
from app01.utils.pagination import Pagination
from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm



def prettynum_list(request):
    """靓号列表"""

    #循环创建300条数据
    # for i in range(300):
    #     models.PrettyNum.objects.create(mobile="15002609022", price=10, level=1, status=1)

    # # http://127.0.0.1:8000/prettynum/list/?q=0710浏览器传入参数
    # value = request.GET.get('q')
    # #筛选出mobile中包含0710的手机号
    # data_dict = {"mobile__contains": "0710"}
    # res = models.PrettyNum.objects.filter(**data_dict)
    # print(res)

    data_dict = {}
    search_data = request.GET.get('q', "")
    if search_data:
        data_dict[ "mobile__contains"] = search_data
    # res = models.PrettyNum.objects.filter(**data_dict)
    # print(res)

    queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")

    page_object = Pagination(request, queryset)

    context = {
        "search_data": search_data,

        'queryset': page_object.page_queryset, #分完页的数据
        "page_string": page_object.html() #生成的页码
    }

    return render(request, 'prettynum_list.html', context)

def prettynum_add(request):
    """添加靓号"""
    if request.method == "GET":
        form = PrettyModelForm()
        return render(request, 'prettynum_add.html', {"form": form})
    # POST提交,进行数据校验
    form = PrettyModelForm(data=request.POST)
    if form.is_valid():
        # 如果数据合法,保存到数据库
        form.save()
        return redirect('/prettynum/list')
    # 如果数据不合法,显示错误信息
    return render(request, 'prettynum_add.html', {"form": form})

def prettynum_edit(request, nid):
    """编辑靓号"""
    row_object = models.PrettyNum.objects.filter(id=nid).first()
    if request.method == "GET":
        # 根据ID去数据库获取要编辑的那一行数据(对象)
        # row_object = models.UserInfo.objects.filter(id=nid).first()

        # instance = row_object自动将要编辑的那一行数据显示出来
        form = PrettyEditModelForm(instance=row_object)
        return render(request, 'prettynum_edit.html', {'form': form})

    # 修改后提交
    # 修改数据更新而不是新建
    # row_object = models.UserInfo.objects.filter(id=nid).first()
    form = PrettyEditModelForm(data=request.POST, instance=row_object)

    if form.is_valid():
        # form.save()默认是保存的用户输入的所有数据
        # 如果想要在用户输入以外在增加一些值用form.instance.字段名 = 某个值
        form.save()
        return redirect('/prettynum/list/')
    return render(request, 'prettynum_edit.html', {"form": form})

def prettynum_delete(request, nid):
    """删除靓号"""
    models.PrettyNum.objects.filter(id=nid).delete()
    return redirect('/prettynum/list/')

user.py

from django.shortcuts import render, redirect
from app01 import models
from app01.utils.pagination import Pagination
from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm



def user_list(request):
    """用户管理"""
    # 获取数据库中所有数据列表,得到的为queryset类型,[obj,obj,obj]
    queryset = models.UserInfo.objects.all()
    page_object = Pagination(request, queryset, page_size=2)
    """
    #循环拿到数据用python语言
    for obj in queryset:

        # print(obj.id, obj.name, obj.acount, obj.creata_time, type(obj.creata_time))
        # type(obj.creata_time)注意:type查看creata_time类型为datatime,需将其转换为字符串
        # datatime转换为字符串obj.creata_time.strftime("%Y-%m-%d")
        # print(obj.id, obj.name, obj.acount, obj.creata_time.strftime("%Y-%m-%d"), obj.get_gender_display())

        # obj.gender #取到的是我们自己定义的性别1或2
        # obj.get_gender_display()#取到的是性别1或2对应的值男或女 格式就是get_字段名称_display()
        # 若models.py中定义了level_choices,获取level的值格式就是get_level_display()

        # print(obj.name, obj.depart.title)
        # obj.depart_id #取到的为数据库值,1、2、3、4
        # obj.depart #根据id自动关联的表中获取那一行数据depart对象
        # obj.depart.title # 获取部门id所对应的中文名称
        print(obj.id, obj.name, obj.acount, obj.creata_time.strftime("%Y-%m-%d"), obj.get_gender_display(), obj.depart.title)
    """
    context ={
        "queryset": page_object.page_queryset,
        "page_string": page_object.html() ,
    }
    return render(request, 'user_list.html', context)

def user_add(request):
    """添加用户(原始方式)"""

    if request.method == "GET":
        context = {
            'gender_choices': models.UserInfo.gender_choices,
            'depart_list': models.Department.objects.all()
        }
        return render(request, 'user_add.html', context)

    # 获取用户提交的数据
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')
    age = request.POST.get('age')
    acount = request.POST.get('ac')
    ctime = request.POST.get('ctime')
    gender = request.POST.get('gd')
    depart_id = request.POST.get('dp')

    # 添加到数据库
    models.UserInfo.objects.create(name=user, password=pwd, age=age, acount=acount, creata_time=ctime, gender=gender,
                                   depart_id=depart_id)

    # 返回到用户列表页面
    return redirect("/user/list/")

def user_model_form_add(request):
    """添加用户(ModelForm版本)"""
    if request.method == "GET":
        form = UserModelForm()
        return render(request, 'user_model_form_add.html', {"form": form})

    # 用户POST提交数据,数据校验
    form = UserModelForm(data=request.POST)
    if form.is_valid():
        # 如果数据合法,打印数据
        print(form.cleaned_data)
        # 如果数据合法,保存到数据库
        form.save()
        return redirect('/user/list/')

    # else:
    #     # 如果数据不合法,输出错误信息
    #     print(form.errors)

    # 校验失败,在页面上显示错误信息
    return render(request, 'user_model_form_add.html', {"form": form})

def user_edit(request, nid):
    """编辑用户"""
    row_object = models.UserInfo.objects.filter(id=nid).first()

    if request.method == "GET":
        # 根据ID去数据库获取要编辑的那一行数据(对象)
        # row_object = models.UserInfo.objects.filter(id=nid).first()

        # instance = row_object自动将要编辑的那一行数据显示出来
        form = UserModelForm(instance=row_object)
        return render(request, 'user_edit.html', {'form': form})

    # 修改后提交
    # 修改数据更新而不是新建
    # row_object = models.UserInfo.objects.filter(id=nid).first()
    form = UserModelForm(data=request.POST, instance=row_object)

    if form.is_valid():
        # form.save()默认是保存的用户输入的所有数据
        # 如果想要在用户输入以外在增加一些值用form.instance.字段名 = 某个值
        form.save()
        return redirect('/user/list/')
    return render(request, 'user_edit.html', {"form": form})

def user_delete(request, nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/user/list/')

修改urls.py

将拆分的depart, pretty, user导入

from app01.views import depart, pretty, user

修改为

from django.contrib import admin
from django.urls import path
from app01 import views
from app01.views import depart, pretty, user

urlpatterns = [

    # path('admin/', admin.site.urls),

    #部门表
    path('depart/list/', depart.depart_list),
    path('depart/add/', depart.depart_add),
    path('depart/delete/', depart.depart_delete),
    # http://127.0.0.1:8000/depart/1/edit/以这种方式传递nid
    # http://127.0.0.1:8000/depart/13/edit/
    path('depart/<int:nid>/edit/', depart.depart_edit),

    #用户表
    path('user/list/', user.user_list),
    path('user/add/', user.user_add),
    path('user/model/form/add/', user.user_model_form_add),
    path('user/<int:nid>/edit/', user.user_edit),
    path('user/<int:nid>/delete/', user.user_delete),

    #靓号表
    path('prettynum/list/', pretty.prettynum_list),
    path('prettynum/add/', pretty.prettynum_add),
    path('prettynum/<int:nid>/edit/', pretty.prettynum_edit),
    path('prettynum/<int:nid>/delete/', pretty.prettynum_delete),
]

  

 完成