Python实现员工管理系统(Django页面版 ) 四

        本篇博客我们将一下实现账号管理的板块,本次板块我们还是分两次讲解,便于大家理解。下面是我们本次需要实现的界面展示:

账号管理创建步骤:

1. 在models.py里面完成员工列表的数据表建立以及迁移操作

2. 根据需要实现的需求在urls.py配置好每个需求的url地址。

3 根据需求完成实现每个需求对应的函数板块

4. 完成页面展示

5 . 翻页和条件筛选模块实现(下节讲解)

下面我们开始本篇博客的代码逻辑思路讲解:

账号管理的实现步骤

1. 数据表的建立以及迁移操作

首先我们先确定账号管理的各个字段以及字段的一些约束

ID:账号编号。数据类型位BigInt型,由Django自动创建,是每一条数据的主键。

mobile:手机号。数据类型为char型,规定手机号最大长度为11位

price:账号价值。数据类型位int型,默认值为0.

level:账号级别。数据类型为SmallInt型,默认值为1,这里会做一个映射。

status:账号状态。数据类型为SmallInt型,默认值为2,这里会做一个映射。 

这里对映射的理解在之前的博客讲过,如果有不明白的地方可以查看一下之前的博客,这里就不在赘述。

Python实现员工管理系统(Django页面版 ) 二-CSDN博客

 models.py:

class PrettyNum(models.Model):
    mobile = models.CharField(verbose_name='手机号',max_length=11)
    price = models.IntegerField(verbose_name='价格',default=0)
    level_choice = (
        (1,'一级'),
        (2,'二级'),
        (3,'三级'),
        (4,'四级'),
    )
    level = models.SmallIntegerField(verbose_name='级别',choices=level_choice,default=1)
    status_choice = (
        (1,'已使用'),
        (2,'未使用')
    )

    status = models.SmallIntegerField(verbose_name='状态',choices=status_choice,default=2)

数据迁移操作:

 当你的数据库中出现project_manage_prettynum,就表示你的数据迁移成功啦。

 

我们现在先插入一些数据,方便我们后面在进行界面展示的时候能够检验自己是否成功操作。

 下面我们开始我们的各个板块的需求实现。

2. 需求实现

        在本次需求实现中我们需要实现账号列表的展示,添加账号,删除账号,以及编辑账号。后面的翻页以及条件筛选在下一篇博客讲解。

2.1 账号列表的展示:

        首先我们在我们之前创建的views文件夹里面再创建一个pretty文件,用来封装我们的账号管理的各个实现组件的代码。

        对于账号列表的展示代码其实和之前的员工列表和部门列表的展示是一样的,都是先获取到数据库中的所有数据,然后通过前端代码展示到界面上。

pretty.py:

def pretty_list(request):
    # 获取数据库中的所有数据
    data_pretty_list = models.PrettyNum.objects.all()
    # 将数据传递到pretty_list.html中
    return render(request, "pretty_list.html", {"data_pretty_list": data_pretty_list})

pretty_list.html:

{% extends 'layout.html' %}
{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px">
            {# target="_blank" 重新打开一个页面 #}
            <a href="/pretty/add/" class="btn btn-success">
                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 新建账号</a>
        </div>
        <div class="panel panel-success">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> 账号列表</h3>
            </div>
            <div class="panel-body">
                <table class="table">
                    <thead>
                    <tr>
                        <th>账号ID</th>
                        <th>号码</th>
                        <th>价格</th>
                        <th>级别</th>
                        <th>状态</th>
                        <th>操作</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for data in data_pretty_list %}
                        <tr>
                            <td>{{ data.id }}</td>
                            <td>{{ data.mobile }}</td>
                            <td>{{ data.price }}</td>
                            <td>{{ data.get_level_display }}</td>
                            <td>{{ data.get_status_display }}</td>
                            <td>
                                {#                                <a href="/user/delete/?nid={{ data.id }}"><span class="glyphicon glyphicon-trash"#}
                                {#                                                                                aria-hidden="true"#}
                                {#                                                                                style="color: red"></span></a>#}
                                <a href="/pretty/{{ data.id }}/delete/"><span class="glyphicon glyphicon-trash"
                                                                              aria-hidden="true"
                                                                              style="color: red"></span></a>
                                <span>&nbsp;&nbsp;</span>
                                <a href="/pretty/{{ data.id }}/modify"><span class="glyphicon glyphicon-new-window"
                                                                             aria-hidden="true"
                                                                             style="color: #2aabd2"></span></a>
                            </td>
                        </tr>
                    {% endfor %}

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

配置路由(URL)

    # 账号列表
    path('pretty/list/', pretty.pretty_list),

启动服务后点击账号管理,即可跳转到下面的界面,这样我们的账号列表即可完成。 

2.2 账号信息的添加:

        对于账号信息的添加我们使用上篇博客提到的ModelForm来实现,今天我们会介绍一个ModelForm的一个新的板块叫做钩子方法。 

钩子方法的介绍:

        Django钩子方法是指在Django框架中提供的一些回调方法,用于在特定的时间点执行一些自定义的逻辑。这些方法可以被开发者在自己的代码中覆盖或扩展,从而实现定制化的处理。

ModelFrom的介绍在之前的博客中有过介绍,这里就不作重复的赘述。

Python实现员工管理系统(Django页面版 ) 三-CSDN博客

pretty.py:

# 账号添加
def pretty_add(request):
    title = '增加账号'
    if request.method == 'GET':
        form = PrettyModelForm()
        return render(request,'public_add-modify.html',{'form':form})

    form = PrettyModelForm(data=request.POST)

    if form.is_valid():
        print(form.cleaned_data)
        form.save()
        return redirect('/pretty/list')
    return render(request,'public_add-modify.html',{'form':form,'title':title})

        我们对于账号电话的字段的约束想要进行进一步的约束,例如我们希望电话号码的第一个数字为1,第二个数字是在 3 - 9 的范围内,最后9个数字随意。在这里我们使用正则表达式是非常容易实现的,在这里不要用常规的re模块进行表示,Django为我们提供了专门用来正则表达式的模块RegexValidator。

pretty.py:

class PrettyModelForm(forms.ModelForm):
    mobile = forms.CharField(
        label='手机号',
        validators=[RegexValidator(r'^1[3-9]\d{9}$','请输入正确的手机号')]
    )

    class Meta:
        model = models.PrettyNum
        # 只选取这4个字段
        fields = ['mobile','price','level','status']
        

效果展示:

        钩子方法的使用。我们继续对电话进行一个约束,我们在对电话进行添加时,我们肯定不希望它与之前的电话重复,因为一个电话只能给一个人用。

在编写钩子方法前我们先介绍 clean_data

clean_data 是我们提交之后将我们提交的数据以键值对的形式给我们进行展示。

我们先做一个提交操作,然后打印一下clean_data看一下效果。

 

钩子方法,对哪一个字段进行处理,函数名必须是clean_+该字段名:

class PrettyModelForm(forms.ModelForm):
    mobile = forms.CharField(
        label='手机号',
        validators=[RegexValidator(r'^1[3-9]\d{9}$','请输入正确的手机号')]
    )
    class Meta:
        model = models.PrettyNum
        fields = ['mobile','price','level','status']

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

    def clean_mobile(self):
        # 将提交的数据与数据表里面的数据进行一个条件查询
        txt_mobile = self.cleaned_data['mobile']
        exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
        if exists:
            raise ValidationError('手机号已存在')
        # 将数据返回到字段mobile中
        return txt_mobile

        public_add-modify.html 我们在上一篇博客讲过,由于我们对于使用ModelForm进行处理时我们添加和编辑操作是一样的,只是需要获取到的字段不同,我们只需要将对应的字段添加进去即可。这里就不进行赘述,有需要查看的麻烦自行查阅。

Python实现员工管理系统(Django页面版 ) 三-CSDN博客

路由的配置:

urls.py

    # 账号添加
    path('pretty/add/', pretty.pretty_add),

这样我们的账号信息添加板块就完成了。

2.3 账号信息编辑:

        账号信息编辑其实和账号信息添加操作差不多,只是需要对部分代码进行一个修改。同时在这里我们也需要重新写入一个钩子方法,专门用于编辑时会出现的一些问题。

pretty.py:

def pretty_modify(request,nid):
    title = '编辑部门'
    obj = models.PrettyNum.objects.filter(id=nid).first()
    if request.method == 'GET':
        form = PrettyModifyModelForm(instance=obj)
        return render(request,'public_add-modify.html',{'form':form,'title':title})
    # instance 告诉数据库现在在做编辑操作
    form = PrettyModifyModelForm(data=request.POST,instance=obj)
    if form.is_valid():
        form.save()
        return redirect('/pretty/list')
    return render(request,'public_add-modify.html',{'form':form,'title':title})

我们在这里重新为pretty_modify写一个编辑的ModelForm类。

        我们现在想要用户在进行编辑操作时,手机号码的那个字段不可编辑,而且也得有手机号码的查重检验。

class PrettyModifyModelForm(forms.ModelForm):
    # 禁止编辑
    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)
        for name,field in self.fields.items():
            field.widget.attrs = {"class": "form-control"}

    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

这样看上去的代码其实和刚刚的添加操作差不多,只是对于字段mobile多了一个不能编辑的设置,那我们看看提交后的效果是怎么样的。

例如我们现在想要修改第一个数据

 提交后我们会发现它为我们显示了一个手机号码已经存在 

        其实这个就是我们这个编辑操作需要注意到的一个点,因为编辑操作的钩子方法在对于查重检验是会默认将所有的数据都遍历一遍,如果有重复的则返回手机号已存在,显然进行操作的这个数据就与自己相互冲突了,因此我们在进行编辑操作时需要避免与自己冲突 ,我们采取的方法是使用exclude这个方法。

在钩子方法对于查重操作时加一个显示,除了自身其他的都需要遍历一遍。instance.pk表示的是现在数据的id值,加入之后我们再进行操作就发现可以成功提交了。 

 这里的前端代码还是那个 public_add-modify.html,这个是通用的。

路由的配置:

    # 账号编辑
    path('pretty/<int:nid>/modify/', pretty.pretty_modify),

2.4 账号信息的删除:

        删除操作是非常容易实现的,在之前的博客中已经讲述的很清楚了,在这里就直接给代码了,大家自行查看。

pretty.py:

def pretty_delete(request,nid):
    models.PrettyNum.objects.filter(id=nid).delete()
    return redirect('/pretty/list')

urls:

    # 账号删除
    path('pretty/<int:nid>/delete/', pretty.pretty_delete, name="pretty_delete"),

 在这里我们的账号管理的功能实现就完成了,如果大家有哪些不明白的,欢迎大家私信。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值