django web开发(六)靓号管理

靓号管理

已学部分

无注释纯享

models.py
class PrettyNum(models.Model):
    """靓号表"""
    mobile = models.CharField(verbose_name="手机号",max_length=11)
    price = models.IntegerField(verbose_name="价格",null=True,blank=True)
    # 允许为空
    level_choices = ((5, "ssr"),(4,'s'),(3,'a'),(2,'b'),(1,'c'))
    level = models.SmallIntegerField(verbose_name="等级",choices=level_choices,default=5)

    status_choices = ((1, "占用"), (2, "未占用"))
    status = models.SmallIntegerField(verbose_name="状态",choices=status_choices,default=2)

url.py

from django.contrib import admin
from django.urls import path
from bm01 import views

urlpatterns = [
    # 靓号管理
    path('plist/', views.plist),
    path('padd/', views.prety_add),
    path('pretty/<int:dpid>/del', views.pretty_delete),
    path('pretty/<int:epid>/edit', views.pretty_edit),

]

views.py
def plist(request):
    # 相当于select * from 表 order by level desc;
    plist = models.PrettyNum.objects.all().order_by("-level")
    return render(request, 'pretty_list.html', {"plist": plist})


from django import forms


class PModelForm(forms.ModelForm):
    class Meta:
        # fields = ["model", "price", "level", "status"]
        fields = '__all__'
        model = models.PrettyNum
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}


def prety_add(request):
    if request == "GET":
        pform = PModelForm()
        return render(request, 'pretty_add.html', {'form': pform})
    pform = PModelForm(request.POST)
    if pform.is_valid():
        pform.save()
        return redirect("/plist/")
    return render(request, 'pretty_add.html', {'form': pform})


def pretty_edit(request, epid):
    p_obj = models.PrettyNum.objects.filter(id=epid).first()
    if request.method == "GET":
        pform = PModelForm(instance=p_obj)
        return render(request, 'pretty_add.html', {'form': pform})
    pform = PModelForm(data=request.POST, instance=p_obj)
    if pform.is_valid():
        pform.save()
        return redirect("/plist/")
    return render(request, 'pretty_add.html', {'form': pform})


def pretty_delete(request, dpid):
    models.PrettyNum.objects.filter(id=dpid).delete()
    return redirect("/plist/")

pretty_list.html

{% extends 'moban.html' %}

{% block mbname %}
<div>
    <div class="container">

        <div class="bs-example" data-example-id="panel-without-body-with-table">
            <div class="panel panel-default">
                <!-- Default panel contents -->
                <div class="panel-heading"><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 部门列表
                </div>
                <!-- Table -->
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>ID</th>
                        <th>号码</th>
                        <th>价格</th>
                        <th>级别</th>
                        <th>状态</th>
                        <th>操作</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for i in plist %}
                        <tr>
                            <td>{{ i.id }}</td>
                            <td>{{ i.mobile }}</td>
                            <td>{{ i.price }}</td>
                            <td>{{ i.level }}</td>
                            <td>{{ i.status }}</td>
                            <td>
                                <a class="btn btn-primary btn-xs" href="/pretty/{{ i.id }}/edit">编辑</a>
                                <a class="btn btn-danger btn-xs" href="/pretty/{{ i.id }}/del">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>

    </div>
</div>
{% endblock %}

pretty_add.html
{% extends 'moban.html' %}

{% block mbname %}
    <div>
        <div class="container">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">靓号添加</h3>
                </div>
                <div class="panel-body">
                    <div class="container">
                        <form class="form-horizontal" method="post" novalidate>
                            {% csrf_token %}

                            {% for field in form %}
                                <div class="form-group">
                                    <label class="col-sm-2 control-label">{{ field.label }}: </label>
                                    <div class="col-sm-8">
                                        {{ field }}
                                        {{ field.errors.0 }}
                                    </div>
                                </div>
                            {% endfor %}

                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="submit" class="btn btn-primary">提交</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>

        </div>
    </div>
{% endblock %}

pretty_edit.html
{% extends 'moban.html' %}

{% block mbname %}
    <div>
        <div class="container">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">靓号编辑</h3>
                </div>
                <div class="panel-body">
                    <div class="container">
                        <form class="form-horizontal" method="post" novalidate>
                            {% csrf_token %}

                            {% for field in form %}
                                <div class="form-group">
                                    <label class="col-sm-2 control-label">{{ field.label }}: </label>
                                    <div class="col-sm-8">
                                        {{ field }}
                                        {{ field.errors.0 }}
                                    </div>
                                </div>
                            {% endfor %}

                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="submit" class="btn btn-primary">提交</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>

        </div>
    </div>
{% endblock %}

验证

字段正则

判断是否符号手机号格式

from django.core.validators import RegexValidator

    # label覆盖掉PrettyNum传过来的verbose_name信息;validators按照正则验证
    mobile = forms.CharField(
        label="手只因号",
        validators=[RegexValidator(r'^[3-9]/d{9}$', '手机号都能输错???')]
    )

正则不能操作数据库

钩子方法

定义为必须def clean_字段名(self)
cleaned_data验证后用户输入的所有数据 ,包含使用用户输入的值,获取[“列名”]
self.instance 为当前行的数据库中的数据,id=self.instance.pk ;name=self.instance.name
return 验证通过返回值 ,返回什么数据库就保存什么,覆盖掉mobile的值
输入框的错误提示raise ValidationError(“提示信息”)

判断手机号是否存在,
(add时)

from django.core.exceptions import ValidationError

    # 校验方法2 :钩子方法验证
    # 必须cleam_字段名
    def clean_mobile(self):
        # cleaned_data包含使用用户输入的值取mobile
        txtm = self.cleaned_data["mobile"]
        # .exists()判断手机号是否存在 true/false
        existsm = models.PrettyNum.objects.filter(mobile=txtm).exists()
        if existsm:
            # 验证不通过返回信息
            raise ValidationError("错误,手机号已存在:(")
        # 验证通过返回值
        return txtm

(edit)
self.instance.pk为操作列数据的id
.exclude(id=self.instance.pk)除去自己以外的元素

       existsm = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txtm).exists()
      

写在class PModelForm()里面

from django.core.validators import RegexValidator

from django.core.exceptions import ValidationError

class PModelForm(forms.ModelForm):
    '''
    # 验证方式1,
    # label覆盖掉PrettyNum传过来的verbose_name信息;validators按照正则验证
    mobile = forms.CharField(
        label="手只因号",
        validators=[RegexValidator(r'^[3-9]/d{9}$', '手机号都能输错???')]
    )
    '''

    class Meta:
        fields = '__all__'
        # exclude = ['price',]
        # fields = ["mobile", "price", "level", "status"]
        model = models.PrettyNum

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}
    '''
    # 校验方法2 :钩子方法验证
    # 必须cleam_字段名
    def clean_mobile(self):
        # cleaned_data包含使用用户输入的值取mobile
        txtm=self.cleaned_data["mobile"]
        if len(txtm) !=11:
            # 验证不通过返回信息
            raise ValidationError("错误信息:(")
        # 验证通过返回值
        return txtm
 '''

禁止编辑

显示

mobile = forms.CharField(disabled=True, label=“不让改号”)


class PEditModelForm(forms.ModelForm):
    mobile = forms.CharField(disabled=True, label="不让改号")

    class Meta:
        fields = ["mobile", "price", "level", "status"]
        model = models.PrettyNum

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}

无法修改手机号
在这里插入图片描述

不显示

 fields = ["price", "level", "status"] 

去掉"mobile", ,没有手机号的框

收索框

预备知识

query1 = PrettyNum.objects.filter(mobile=15576547933, id=4)
print(query1)

# 如果是空字典,表示获取所有
query_dict = {"mobile": "15576547933", "id": 4}
query2 = PrettyNum.objects.filter(**query_dict)
print(query2)

greater than lessequal

PrettyNum.objects.filter(id=4)			# 等于4
PrettyNum.objects.filter(id__gt=4)		# 大于4
PrettyNum.objects.filter(id__gte=4)		# 大于等于4
PrettyNum.objects.filter(id__lt=4)		# 小于4
PrettyNum.objects.filter(id__lte=4)		# 小于等于4

PrettyNum.objects.filter(mobile__startswith="1999")		# 筛选出以"1999"开头的
PrettyNum.objects.filter(mobile__endswith="1999")		# 筛选出以"1999"结尾的
PrettyNum.objects.filter(mobile__contains="1999")		# 筛选出包含"1999"开头的

实现

view.py

def pretty_list(request):
    """靓号列表"""
		#搜素条件 默认为空
    data_dict = {}
    
    search_data = request.GET.get('query', "")  # 不加后面的 "", 首次访问浏览器,搜索框中不会显示前端页面中的 placeholder="Search for..." 属性
    if search_data:
    	# mobile_contains  表示筛选出字段 mobile 包含 search_data 数据的行
        data_dict["mobile__contains"] = search_data


    # data_dict 如果是空字典,表示获取所有 ,level降序
    pretty_data = PrettyNum.objects.filter(**data_dict).order_by("-level")

	# 加入search_data的目的是,当搜索后,搜索框内的值不会置为空
    return render(request, "pretty_list.html", {"pretty_data": pretty_data, "search_data": search_data})

pretty_list.html

<form method="get">
                        <div class="input-group">
                            <input name="se" type="text" class="form-control" placeholder="Search for..." value="{{ search_data }}">
                            <span class="input-group-btn">
                            <button class="btn btn-default" type="submit" >search number</button>
                        </span>
                        </div>
                    </form>

在这里插入图片描述

分页

准备

    '''
    # 添加100行数据
    for i in range(100):
        models.PrettyNum.objects.create(mobile="1888888888", price=18, level=3, status=1)
    '''

分页逻辑

from django.utils.safestring import mark_safe


def plist(request):
    """靓号列表"""
    ########################     搜索
    dict = {}
    search_data = request.GET.get('se', "")
    if search_data:
        dict = {"mobile__contains": search_data}

    #######################      分页
    # page当前页
    page = int(request.GET.get("page", 1))
    page_size = 5
    start = (page - 1) * page_size
    end = page * page_size
    #    plist = models.PrettyNum.objects.order_by("-level")[start:end]
    #	此时url ...list/?page=5,返回第五页的十行数据

    # 计算总页数
    total_count = models.PrettyNum.objects.filter(**dict).order_by("-level").count()

    # 计算总页数 total_page_count:数据被分为多少页
    total_page_count, div = divmod(total_count, page_size)
    if div:
        total_page_count += 1

    # 显示的页码数量
    page_show = 5
    # 判断页码复合规范
    # 页数小于11,能够全部展示
    if total_page_count <= 2 * page_show + 1:
        page_start = 1
        page_end = total_page_count +1
    # 页数小于5
    elif page <= page_show:
        page_start = 1
        page_end = 2 * page_show + 1
    # 页数大于 max+5
    elif page >= total_page_count - page_show:
        page_start = total_page_count - 2 * page_show
        page_end = total_page_count +1
    # 正常
    else:
        page_start = page - page_show
        page_end = page + 1 + page_show




    # 页码
    page_str_list = []

    # 首页
    page_str_list.append('<li ><a href="?page={}">首页</a> </li>'.format( 1))
    # 上一页
    if page > 1:
        prev = '<li ><a href="?page={}">上一页</a> </li>'.format(page-1)
    else:
        prev = '<li><a href="?page={}">上一页</a></li>'.format(1)
    page_str_list.append(prev)

    # 1到最后一页的li标签生成,,mark_safe把字符串变为安全,---->html代码
    for i in range(page_start, page_end):
        if i == page:
            ele = '<li class="active"><a href="?page={}">{}</a> </li>'.format(i, i)
        else:
            ele = '<li><a href="?page={}">{}</a></li>'.format(i, i)
        page_str_list.append(ele)


    # 下一页
    if page < total_page_count:
        prev = '<li ><a href="?page={}">下一页</a> </li>'.format(page + 1)
    else:
        prev = '<li><a href="?page={}">下一页</a></li>'.format(total_page_count)
    page_str_list.append(prev)
    # 尾页
    page_str_list.append('<li ><a href="?page={}">尾页</a> </li>'.format(total_page_count))

    # 搜索页
    ssli="""          <li>
                        <form class="navbar-form navbar-left" method="get">
                            <div class="form-group">
                                <input type="text" class="form-control" placeholder="Search" name="page">
                            </div>
                            <button type="submit" class="btn btn-default">Submit</button>
                        </form>
                    </li>"""
    page_str_list.append(ssli)


    page_string = mark_safe("".join(page_str_list))
    plist = models.PrettyNum.objects.filter(**dict).order_by("-level")[start:end]

    return render(request, 'pretty_list.html',
                  {"plist": plist,
                   "search_data": search_data,
                   "page_string": page_string,
                   })


html

        <div>
            <nav >
                <ul class="pagination">
                    {{ page_string }}
                </ul>
            </nav>
        </div>

在这里插入图片描述

分页封装 !!!

新建文件 app/untils/pagination.py
在这里插入图片描述将分页的功能封装
写入

# author : Sun;  time : 2023/2/8 14:19;
"""
自定义分页组件,以后使用过程中,需要:
在视图函数中:
    def pretty_list(request):

        # 1.根据自己的情况去筛选自己的数据
        queryset = models.PrettyNum.objects.all()

        # 2.实例化分页对象
        page_object = Pagination(request, queryset)

        context = {
            "queryset": page_object.page_queryset,  # 分完页数据
            "page_string": page_object.html(),      # 页码
        }
        # if request.method == "GET":  # 以“GET”可以 传参 ?=888, page=1
        return render(request, "pretty_list.html", context)

在html中:
        # 1.数据
        {% for obj in queryset %}
            {{ obj.xx }}
        {% endfor %}

        # 2.分页
        <ul class="pagination">
            {{ page_string }}
        </ul>
"""
from django.utils.safestring import mark_safe


class Pagination(object):
    def __init__(self, request, queryset, page_pram='page', page_size=5, page_show=5):
        """
        :param request: 请求的对象
        :param queryset: 符合条件的数据(根据此数据进行分页处理)
        :param page_size: 每页显示多少条数据
        :param page_param: 获取在URL中传递的分页参数, 例如: /pretty/list/?page=21
        :param page_show: 页码显示前几页后几页
        """

        page = request.GET.get(page_pram, "1")
        if page.isdecimal():
            page = int(page)
        else:
            print(type(page))
            page = 3

        self.page = page
        self.start = (page - 1) * page_size
        self.end = page * page_size
        total_count = queryset.count()
        total_page_count, div = divmod(total_count, page_size)
        if div:
            total_page_count += 1
        self.total_page_count = total_page_count
        self.page_show = page_show
        self.page_queryset = queryset[self.start:self.end]

    def html(self):
        # 判断页码复合规范
        # 页数小于11,能够全部展示
        if self.total_page_count <= 2 * self.page_show + 1:
            page_start = 1
            page_end = self.total_page_count + 1
        # 页数小于5
        elif self.page <= self.page_show:
            page_start = 1
            page_end = 2 * self.page_show + 1
        # 页数大于 max+5
        elif self.page >= self.total_page_count - self.page_show:
            page_start = self.total_page_count - 2 * self.page_show
            page_end = self.total_page_count + 1
        # 正常
        else:
            page_start = self.page - self.page_show
            page_end = self.page + 1 + self.page_show

        # 页码
        page_str_list = []

        # 首页
        page_str_list.append('<li ><a href="?page={}">首页</a> </li>'.format(1))
        # 上一页
        if self.page > 1:
            prev = '<li ><a href="?page={}">上一页</a> </li>'.format(self.page - 1)
        else:
            prev = '<li><a href="?page={}">上一页</a></li>'.format(1)
        page_str_list.append(prev)

        # 1到最后一页的li标签生成,,mark_safe把字符串变为安全,---->html代码
        for i in range(page_start, page_end):
            if i == self.page:
                ele = '<li class="active"><a href="?page={}">{}</a> </li>'.format(i, i)
            else:
                ele = '<li><a href="?page={}">{}</a></li>'.format(i, i)
            page_str_list.append(ele)

        # 下一页
        if self.page < self.total_page_count:
            prev = '<li ><a href="?page={}">下一页</a> </li>'.format(self.page + 1)
        else:
            prev = '<li><a href="?page={}">下一页</a></li>'.format(self.total_page_count)
        page_str_list.append(prev)
        # 尾页
        page_str_list.append('<li ><a href="?page={}">尾页</a> </li>'.format(self.total_page_count))

        # 搜索页
        ssli = """          <li>
                                <form class="navbar-form navbar-left" method="get">
                                    <div class="form-group">
                                        <input type="text" class="form-control" placeholder="Search" name="page">
                                    </div>
                                    <button type="submit" class="btn btn-default">Submit</button>
                                </form>
                            </li>"""
        page_str_list.append(ssli)

        page_string = mark_safe("".join(page_str_list))

        return page_string


views.py

def plist(request):
    """靓号列表"""
    ########################     搜索 ########
    data_dict = {}
    search_data = request.GET.get('se', "")
    if search_data:
        data_dict = {"mobile__contains": search_data}
    queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")
	 ########################     搜索end ########
    # 生成对象
    # request 函数请求的对象
    # queryset 将已经查找出的符合条件的数据
    page_object = Pagination(request, queryset)

    context = {"search_data": search_data,
               "plist": page_object.page_queryset,  # 调用方法生成 每一页要展示的行对象,分完页的数据,qs类型
               "page_string": page_object.html(),  # 调用方法生成 分页的html代码(一堆str
               }
    return render(request, 'pretty_list.html', context)

pretty_list.html

   {% for i in plist %}
                        <tr>
                            <td>{{ i.id }}</td>
                            <td>{{ i.mobile }}</td>
                            <td>{{ i.price }}</td>
                            <td>{{ i.level }}</td>
                            <td>{{ i.status }}</td>
                            <td>
                                <a class="btn btn-primary btn-xs" href="/pretty/{{ i.id }}/edit">编辑</a>
                                <a class="btn btn-danger btn-xs" href="/pretty/{{ i.id }}/del">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
....
....
  <nav>
                <ul class="pagination">
                    {{ page_string }}
                </ul>
            </nav>
....            

分页+查找

解决问题:url中同时出现 …/?page=xxx&se=xxx

函数中修改url方法

__module __ 属性

    import copy
    get_object = copy.deepcopy(request.GET)
    get_object.__module__ = True
    get_object.setlist('page', [4]) #模拟访问page=4时
    print(get_object) #获得原来的参数字典
    print(get_object.urlencode())#组合原来的url参数

访问…list/?page=7&xxx=%275%27&asd=asd
带着原来的参数,又加上了page=4
在这里插入图片描述

修改封装

class Pagination(object):
    def __init__(self, request, queryset, page_pram='page', page_size=5, page_show=5):
    #添加
        import copy
        query_dict = copy.deepcopy(request.GET)
        query_dict.__module__ = True
        self.query_dict = query_dict

url中 去掉page =
修改format

 self.query_dict.setlist(self.page_pram, [i])
 ele = '<li class="active"><a href="?{}">{}</a> </li>'.format(self.query_dict.urlencode(), i)

完整代码

views.py
from bm01.utils.pagination import Pagination


def plist(request):
    """靓号列表"""
    ########################     搜索 ########
    data_dict = {}
    search_data = request.GET.get('se', "")
    if search_data:
        data_dict = {"mobile__contains": search_data}
    queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")

    ########################     分页 ########
    # 生成对象
    # request 函数请求的对象
    # queryset 将已经查找出的符合条件的数据
    page_object = Pagination(request, queryset)
    context = {"search_data": search_data,
               "plist": page_object.page_queryset,  # 调用方法生成 每一页要展示的行对象,分完页的数据,qs类型
               "page_string": page_object.html(),  # 调用方法生成 分页的html代码(一堆str
               }
    return render(request, 'pretty_list.html', context)
preety_list.html
{% extends 'xlayout.html' %}

{% block mbname %}
    <div class="container">
        <div class="row cle" style="margin-bottom: 20px">
            <div class="col-xs-8">
                <a href="/padd/" type="button" class="btn btn-success">+添加靓号</a></div>
            <div class="col-xs-4">
                <form method="get">
                    <div class="input-group">
                        <input name="se" type="text" placeholder="Search for..." value="{{ search_data }}">
                        <span class="input-group-btn">
                            <button class="btn btn-default" type="submit">search number</button>
                        </span>
                    </div>
                </form>
            </div>
        </div>
        <div class="bs-example" data-example-id="panel-without-body-with-table">
            <div class="panel panel-default">
                <!-- Default panel contents -->
                <div class="panel-heading"><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 部门列表
                </div>

                <!-- Table -->
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>ID</th>
                        <th>号码</th>
                        <th>价格</th>
                        <th>级别</th>
                        <th>状态</th>
                        <th>操作</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for i in plist %}
                        <tr>
                            <td>{{ i.id }}</td>
                            <td>{{ i.mobile }}</td>
                            <td>{{ i.price }}</td>
                            <td>{{ i.level }}</td>
                            <td>{{ i.status }}</td>

                            <td>

                                <a class="btn btn-primary btn-xs" href="/pretty/{{ i.id }}/edit">编辑</a>
                                <a class="btn btn-danger btn-xs" href="/pretty/{{ i.id }}/del">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>

        <div>
            <nav>
                <ul class="pagination">
                    {{ page_string }}
                </ul>
            </nav>
        </div>
    </div>


{% endblock %}

封装的使用

对ulist下手!
views.py

在这里插入图片描述

ulist.html
在这里插入图片描述效果就来了
在这里插入图片描述.

整合form

新建myproject/employee_management/utils/form.py
修改myproject/employee_management/views.py.

移动views.py.中所有modelform到form.py
删除三个class的init函数
继承Bootstrapmodelform

在这里插入图片描述form.py

# author : Sun;  time : 2023/2/8 20:57;
from bm01 import models
from bm01.utils.bsmf import BootStrapModelForm
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError

class Umodelform(BootStrapModelForm):

    #方法一:插件 # 用户名最少三位 ,设置列的别名username,label会覆盖掉之前的设置
    # name = forms.CharField(min_length=3,
    #                        label="username",
    #                        widget=forms.TextInput(attrs={'class': 'form-control'})
    #                        )
    #

    class Meta:  # 关键字Meta  model,不一样报错
        model = models.Userinfo
        # fields = ["name", "age", "time"] #可以选择那一列进行填写
        fields = '__all__'

        '''
        # 手动添加属性到attrs中,密码隐藏...
        # 方法二:插件
        widgets = {
            "password": forms.PasswordInput(attrs={'type': "password"})
        }
        '''
    '''   
    # 方法三:重写子类方法,父类框架的方法先执行,再执行子类
    # 重新定义init方法,批量设置,循环ModelForm所有字段 给所有输入框增加样式class
    # 原来的会被覆盖掉
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs = {
                "class": "form-control",
                "placeholder": field.label
            }
    '''

class PModelForm(BootStrapModelForm):

    # 验证方式1,
    # label覆盖掉PrettyNum传过来的verbose_name信息;validators按照正则验证
    # mobile = forms.CharField(
    #     label="手只因号",
    #     validators=[RegexValidator(r'^[3-9]/d{9}$', '手机号都能输错???')]
    # )

    class Meta:
        fields = '__all__'
        # exclude = ['price',]
        # fields = ["mobile", "price", "level", "status"]
        model = models.PrettyNum



    # 校验方法2 :钩子方法验证
    # 必须cleam_字段名
    def clean_mobile(self):
        print(self.instance.pk)
        # cleaned_data包含使用用户输入的值取mobile
        txtm = self.cleaned_data["mobile"]
        # .exists()判断手机号是否存在 true/false
        existsm = models.PrettyNum.objects.filter(mobile=txtm).exists()
        if existsm:
            # 验证不通过返回信息
            raise ValidationError("添加的手机号已存在:(")
        # 验证通过返回值
        return txtm


class PEditModelForm(BootStrapModelForm):
    # mobile = forms.CharField(disabled=True, label="不让改号")

    class Meta:
        fields = ["mobile", "price", "level", "status"]
        model = models.PrettyNum



    def clean_mobile(self):

        # cleaned_data包含使用用户输入的值取mobile
        txtm = self.cleaned_data["mobile"]
        # .exists()判断手机号是否存在 true/false
        existsm = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txtm).exists()
        if existsm:
            # 验证不通过返回信息
            raise ValidationError("编辑的手机号已存在:(")
        # 验证通过返回值
        return txtm

优化views

views.py进行拆分
按照部门进行拆分

新建/root/python/myproject/employee_management/views目录
然后在其下依次新建user.py depart.py pretty.py
user.py

# author : Sun;  time : 2023/2/8 21:32;
from django.shortcuts import render, redirect
from bm01 import models
from bm01.utils.pagination import Pagination
from bm01.utils.form import  Umodelform

def ulist(request):
    # 用户列表

    ulist = models.Userinfo.objects.all()

    user_object = Pagination(request, ulist)
    queryset = user_object.page_queryset
    page_string = user_object.html()

    return render(request, 'ulist.html', {"ulist": queryset, "page_string": page_string})


def uadd(request):
    # 增加用户
    if request.method == "GET":
        # 生成一个Umodelform()类的对象
        form = Umodelform()
        return render(request, 'uadd.html', {'form': form})

    # request.POST包含用户提交所有数据
    form = Umodelform(data=request.POST)

    # Umodelform取fields中字段来进行校验
    if form.is_valid():
        # 拿到输入的字段 {'name': 'django', 'password': 'root', 'age': 29, 'account': Decimal('333'),
        # 'time': datetime.datetime(2011, 11, 11, 0, 0, tzinfo=<UTC>),'depart': <Department: 技术部>, 'gender': 1}

        # print(form.cleaned_data)
        # 自动保存到数据库
        form.save()
        return redirect("/ulist/")

    # 这个地方放的form 有原来用户提交的数据,还有错误信息
    # print(form.errors)
    return render(request, 'uadd.html', {'form': form})


def uedit(request, edid):
    # 编辑用户

    u_obj = models.Userinfo.objects.filter(id=edid).first()
    if request.method == "GET":
        edform = Umodelform(instance=u_obj)
        return render(request, 'uedit.html', {"form": edform})
    edform = Umodelform(data=request.POST, instance=u_obj)
    if edform.is_valid():
        '''
        #默认保存的用户输入的值
        #添加用户输入之外的值可以写
        form.instance.字段名字 = 字段值
        '''
        edform.save()
        return redirect("/ulist/")
    return render(request, 'uedit.html', {"form": edform})


def udel(request):
    # 删除部门
    nid = request.GET.get('delid')
    print(nid)
    models.Userinfo.objects.filter(id=nid).delete()
    return redirect("/ulist/")


depart.py

# author : Sun;  time : 2023/2/8 21:32;
from django.shortcuts import render, redirect
from bm01 import models


def dlist(request):
    # 部门列表
    bmlist = models.Department.objects.all()
    return render(request, 'dlist.html', {"bmlist": bmlist})


def dadd(request):
    # 增加部门
    if request.method == "GET":
        return render(request, 'dadd.html')
    title = request.POST.get("title")
    models.Department.objects.create(title=title)
    return redirect('/dlist/')


def ddel(request):
    # 删除部门,
    nid = request.GET.get('nid')
    models.Department.objects.filter(id=nid).delete()
    return redirect("/dlist/")


def dedit(request, edid):
    # 编辑部门
    if request.method == "GET":
        row_object = models.Department.objects.filter(id=edid).first()
        return render(request, 'dedit.html', {"rtitle": row_object.title})
    title = request.POST.get("title")
    models.Department.objects.filter(id=edid).update(title=title)
    return redirect('/dlist/')

pretty.py

# author : Sun;  time : 2023/2/8 21:34;
from django.shortcuts import render, redirect
from bm01 import models
from bm01.utils.pagination import Pagination
from bm01.utils.form import PModelForm, PEditModelForm

def plist(request):
    """靓号列表"""
    ########################     搜索 ########
    data_dict = {}
    search_data = request.GET.get('se', "")
    if search_data:
        data_dict = {"mobile__contains": search_data}
    queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")

    ########################     分页 ########
    # 生成对象
    # request 函数请求的对象
    # queryset 将已经查找出的符合条件的数据
    page_object = Pagination(request, queryset)
    context = {"search_data": search_data,
               "plist": page_object.page_queryset,  # 调用方法生成 每一页要展示的行对象,分完页的数据,qs类型
               "page_string": page_object.html(),  # 调用方法生成 分页的html代码(一堆str
               }
    return render(request, 'pretty_list.html', context)


def prety_add(request):
    if request == "GET":
        pform = PModelForm()
        return render(request, 'pretty_add.html', {'form': pform})
    pform = PModelForm(request.POST)
    if pform.is_valid():
        pform.save()
        return redirect("/plist/")
    return render(request, 'pretty_add.html', {'form': pform})


def pretty_edit(request, epid):
    p_obj = models.PrettyNum.objects.filter(id=epid).first()
    if request.method == "GET":
        pform = PEditModelForm(instance=p_obj)
        return render(request, 'pretty_edit.html', {'form': pform})
    pform = PEditModelForm(data=request.POST, instance=p_obj)
    if pform.is_valid():
        pform.save()
        return redirect("/plist/")
    return render(request, 'pretty_edit.html', {'form': pform})


def pretty_delete(request, dpid):
    models.PrettyNum.objects.filter(id=dpid).delete()
    return redirect("/plist/")

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值