django之账号管理功能

news2025/7/8 1:59:30

账号管理功能

目录

1.账号管理页面

2.新增账号

3.修改账号

4.账号重置密码

5.删除账号功能

6.所有代码展示集合

7.运行结果

这一片文章, 我们需要新增账号管理功能, 今天我们写到的代码, 基本上都是用到以前所过的知识, 不过也有需要注意的细节。

一、账号管理界面

我们在做页面之前, 先创建好数据库:

models.py:

class AdminRole(models.Model):
    username = models.CharField(verbose_name="用户名", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)
    password_choice = (
        (1, "员工"),
        (2, "领导"),
        (3, "管理员")
    )
    role = models.SmallIntegerField(verbose_name="角色", choices=password_choice)

然后分别在对应项目的目录下执行python manage.py makemigrations和python manage.py migrate去生成新的数据库表格。

随后我们要在templates文件夹下面创建admin文件夹, 然后再创建admin_list.html文件。

admin_list.html代码:

{% extends "index/model_tmp.html" %}

{% block content %}

    <div class="container">
        <a href="/admin/add/" class="btn btn-success">添加信息</a>
        {# 实现搜素查询 #}
        <div style="float: right">
            <form method="get">
                <div class="input-group" style="float: right;width: 300px;">
                    <input type="text" class="form-control" name="search" placeholder="Search for...">
                    <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">搜索</button>
                    </span>
                </div>
            </form>
        </div>

        <div class="panel panel-danger">
            <div class="panel-heading">
                <h3 class="panel-title">用户表</h3>
            </div>
            <div class="panel-body">
                <table class="table table-hover">
                    <thead>
                    <tr>
                        <th>ID</th>
                        <th>用户名</th>
                        <th>密码</th>
                        <th>重置密码</th>
                        <th>角色</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for data in data_list %}
                        <tr>
                            <th scope="row">{{ data.id }}</th>
                            <td>{{ data.username }}</td>
                            <td>******</td>
                            <td><a href="/admin/{{ data.id }}/reset/pwd">重置密码</a></td>
                            <td>{{ data.get_role_display }}</td>
                            <td style="color: green">
                                <a href="/admin/{{ data.id }}/modify"><span style="color: green;"
                                                                             class="glyphicon glyphicon-pencil"
                                                                             aria-hidden="true"></span></a>
                                <a href="/admin/{{ data.id }}/del/"><span style="color: red;"
                                                                           class="glyphicon glyphicon-trash"
                                                                           aria-hidden="true"></span></a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
        {# 实现分页查询 #}
        <ul class="pagination">
            {{ page_string }}
        </ul>
    </div>
{% endblock %}

上述代码, 里面的内容, 和之前写的展示页面的代码, 写法一样, 需要注意的是, 这里面的a标签的路由不要写错了。

我们在views文件夹里面, 创建admin_role.py

代码:

from django.core.exceptions import ValidationError
from django.shortcuts import render, redirect

from project_one.utils import pwd_data
from project_one.utils.PageData import PageData
from django import forms

from project_one import models


# Create your views here.
def admin(request):
    data_list = models.AdminRole.objects.all()
    page_object = PageData(request, data_list)
    content = {
        "data_list": page_object.page_queryset,
        "page_string": page_object.page_html()
    }
    return render(request, "admin/admin_list.html", content)

我们还是要用到上次已经封装好的分页功能。

配置路由:

urls.py:

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role

urlpatterns = [
    # 账号管理页面展示
    path("admin_list/", admin_role.admin)
]

二、新增账号

我们在templates里面的admin下创建文件admin_operation.html, 这个文件, 是我们之后修改数据和重置密码都公用的文件。

admin_operation.html代码:

{% extends "index/model_tmp.html" %}
{% load static %}

{% block css %}
    <link rel="stylesheet" href="{% static 'css/layui.css' %}">
{% endblock %}

{% block content %}
    <div class="container">
        <h1>{{ title }}</h1>
        <form method="post">
            {% csrf_token %}
            {% for filed in form %}
{#       filed.label这里面就是获取我们在models.py里面创建表格里面的每一个字段里面有个verbose_name这个参数的值         #}
                <label for="exampleInputEmail1">{{ filed.label }}</label>
                {{ filed }}
                {#       展示错误信息         #}
                <span style="color: red">{{ filed.errors.0 }}</span>
                <br>
            {% endfor %}
            <button type="submit" class="btn btn-success">提交</button>
        </form>
    </div>
{% endblock %}

{% block js %}

{% endblock %}

后端写新增账号功能:

我们需要在utils文件夹里面创建一个pwd_data.py文件, 里面写的是md5加密的函数, 之后我们都需要对密码进行加密。

就在上篇文章我们写分页功能(给分页功能封装)的那个地方创建文件pwd_data.py:

在这里插入图片描述

pwd_data.py:

import hashlib

# 这个SECRET_KEY就在settings.py文件里面去找, 找到之后把它复制过来
# 我们需要用到这个来进行加盐处理, 这样的话, 别人看到被加过盐的密文, 就破解不了了。
SECRET_KEY = 'django-insecure-m@31x($s*0tgzm0$2(ct6izu)8oe$xa)@k7(&*7tkr*g(dbl)5'


def md5(data):
    obj_md5 = hashlib.md5(SECRET_KEY.encode('utf-8'))
    obj_md5.update(data.encode('utf-8'))
    return obj_md5.hexdigest()

admin_role.py:

from django.core.exceptions import ValidationError
from django.shortcuts import render, redirect
from project_one.utils import pwd_data
from project_one.utils.PageData import PageData
from django import forms
from project_one import models


class AdminAddModelForm(forms.ModelForm):
    # 当前变量名如果和数据表字段一致,则会覆盖,如果不同名,则会添加。
    # 我们的数据库里面没有new_password字段, 所以会添加。
    # 这个是用来做确认密码框用的, 创建账号的时候, 有输入密码和确认密码两个框, 之后判断的时候得确保两个输入框里面的密码是一致的, 账号才能被创建。
    new_password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = models.AdminRole
        # 页面当中的输入框会按照列表的顺序进行展示
        fields = ['username', 'password', "new_password", "role"]
        # 为密码框添加属性, 将它设置为密码输入框, 意味着之后在密码框里面输入数据的时候, 全部都是······这样展示。
        widgets = {
            "password": forms.PasswordInput
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for item, field in self.fields.items():
            # 给输入框增加属性
            field.widget.attrs = {'class': 'form-control'}

    # 我们对密码那栏进行操作, 我们对密码框里面的内容进行加密处理并且存入数据库
    def clean_password(self):
        password = self.cleaned_data["password"]
        # 给密码加密, 用md5加密算法
        return pwd_data.md5(password)

    # 我们对确认密码那栏进行操作, 我们对确认密码框里面的内容进行加密处理并且存入数据库
    def clean_new_password(self):
        # 给确认密码进行加密
        new_password = pwd_data.md5(self.cleaned_data["new_password"])
        # 这里获取到的密码, 是已经加密过的, 因为上面的clean_password函数里面已经加密过pwd了。
        pwd = self.cleaned_data["password"]
        if pwd != new_password:
            raise ValidationError("两次密码不一致")
        return new_password


def admin_add(request):
    title = "添加账号"
    if request.method == "GET":
        form = AdminAddModelForm()
        content = {
            "title": title,
            "form": form
        }
        return render(request, "admin/admin_operation.html", content)
    form = AdminAddModelForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect("/admin_list/")
    return render(request, "admin/admin_operation.html", {"title": title, "form": form})

在自定义的modelform类里面, 有clean_password和clean_new_password两个函数, 它们都是用来做密码校验的, 就是判断两个输入框里面的密码是否一致, 就是我们所谓的确认密码的功能。不过我们在数据库里面, 没有new_password字段, 所以我们需要在modelform自定义类里面的最前面加上new_password = forms.CharField(widget=forms.PasswordInput), 这个是确认密码的输入框, 设置为密码格式, 包括不能忘记下面在构造函数__init__里面最后要加widgets = {“password”: forms.PasswordInput}, 这个是给输入密码的输入框设置为密码格式。admin_add函数里面, 内容和以前文章中写道的添加功能差不多, 所以这里不再赘述里面代码的含义。

配置路由:

urls.py:

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role

urlpatterns = [
    path("admin_list/", admin_role.admin),
    path("admin/add/", admin_role.admin_add)
]

三、修改账号

admin_role.py代码:

class AdminModifyModelForm(forms.ModelForm):
    class Meta:
        model = models.AdminRole
        # 这里我们只需要修改用户名和角色的内容
        fields = ['username', 'role']

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


def admin_modify(request, nid):
    title = "修改账号"
    obj = models.AdminRole.objects.filter(id=nid).first()
    if request.method == "GET":
        form = AdminModifyModelForm(instance=obj)
        content = {
            "title": title,
            "form": form
        }
        return render(request, "admin/admin_operation.html", content)
    form = AdminModifyModelForm(request.POST, instance=obj)
    if form.is_valid():
        form.save()
        return redirect("/admin_list/")
    return render(request, "admin/admin_operation.html", {"title": title, "form": form})

以上就是修改功能的代码, 没有什么特别要讲的地方, 就是fields里面只需要填写两个字段, username和role即可。

路由配置:

urls.py:

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role

urlpatterns = [
    path("admin_list/", admin_role.admin),
    path("admin/add/", admin_role.admin_add),
    path("admin/<int:nid>/modify/", admin_role.admin_modify)
]

四、账号重置密码

admin_role.py:

class AdminResetPwdModelForm(forms.ModelForm):
    new_second_password = forms.CharField(widget=forms.PasswordInput, label="确认密码")

    class Meta:
        model = models.AdminRole
        fields = ['password']
        widgets = {
            "password": forms.PasswordInput
        }

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

    def clean_password(self):
        pwd = self.cleaned_data["password"]
        return pwd_data.md5(pwd)

    def clean_new_password(self):
        new_second_password = pwd_data.md5(self.cleaned_data["new_second_password"])
        pwd = self.cleaned_data["password"]
        if pwd != new_second_password:
            raise ValidationError("两次不一致")
        return new_second_password


def admin_reset_pwd(request, nid):
    title_object = models.AdminRole.objects.filter(id=nid).first()
    title = f"重置<{title_object.username}>密码"
    if request.method == "GET":
        form = AdminResetPwdModelForm(instance=title_object)
        content = {"title": title, "form": form}
        return render(request, "admin/admin_operation.html", content)
    form = AdminResetPwdModelForm(request.POST, instance=title_object)
    if form.is_valid():
        form.save()
        return redirect("/admin_list/")
    return render(request, "admin/admin_operation.html", {"title": title, "form": form})

modelform里面的写法, 和新增账号的modelform里面的写法一模一样。这里的重置密码admin_reset_pwd函数里面要传入nid参数, 我们需要修改我们要修改那行数据里面的密码, 所以需要用nid来定位对应的id号。

路由配置:

urls.py

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role

urlpatterns = [
    path("admin_list/", admin_role.admin),
    path("admin/add/", admin_role.admin_add),
    path("admin/<int:nid>/modify/", admin_role.admin_modify),
    path("admin/<int:nid>/reset/pwd/", admin_role.admin_reset_pwd)
]

五、删除账号功能

这个功能, 我想大家闭着眼睛, 都能写出来了, 那这里就不多解释代码的意思了, 直接上代码:

def admin_del(request, nid):
    models.AdminRole.objects.filter(id=nid).delete()
    return redirect("/admin_list/")

配置路由:

urls.py:

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role

urlpatterns = [
    path("admin_list/", admin_role.admin),
    path("admin/add/", admin_role.admin_add),
    path("admin/<int:nid>/modify/", admin_role.admin_modify),
    path("admin/<int:nid>/reset/pwd/", admin_role.admin_reset_pwd),
    path("admin/<int:nid>/del/", admin_role.admin_del)
]

六、所有代码展示集合

我们把刚才写过的代码进行汇总:

前端页面html代码

admin_list.html:

{% extends "index/model_tmp.html" %}

{% block content %}

    <div class="container">
        <a href="/admin/add/" class="btn btn-success">添加信息</a>
        {# 实现搜素查询 #}
        <div style="float: right">
            <form method="get">
                <div class="input-group" style="float: right;width: 300px;">
                    <input type="text" class="form-control" name="search" placeholder="Search for...">
                    <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">搜索</button>
                    </span>
                </div>
            </form>
        </div>

        <div class="panel panel-danger">
            <div class="panel-heading">
                <h3 class="panel-title">用户表</h3>
            </div>
            <div class="panel-body">
                <table class="table table-hover">
                    <thead>
                    <tr>
                        <th>ID</th>
                        <th>用户名</th>
                        <th>密码</th>
                        <th>重置密码</th>
                        <th>角色</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for data in data_list %}
                        <tr>
                            <th scope="row">{{ data.id }}</th>
                            <td>{{ data.username }}</td>
                            <td>******</td>
                            <td><a href="/admin/{{ data.id }}/reset/pwd">重置密码</a></td>
                            <td>{{ data.get_role_display }}</td>
                            <td style="color: green">
                                <a href="/admin/{{ data.id }}/modify"><span style="color: green;"
                                                                             class="glyphicon glyphicon-pencil"
                                                                             aria-hidden="true"></span></a>
                                <a href="/admin/{{ data.id }}/del/"><span style="color: red;"
                                                                           class="glyphicon glyphicon-trash"
                                                                           aria-hidden="true"></span></a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
        {# 实现分页查询 #}
        <ul class="pagination">
            {{ page_string }}
        </ul>
    </div>
{% endblock %}

admin_operation.html:

{% extends "index/model_tmp.html" %}
{% load static %}

{% block css %}
    <link rel="stylesheet" href="{% static 'css/layui.css' %}">
{% endblock %}

{% block content %}
    <div class="container">
        <h1>{{ title }}</h1>
        <form method="post">
            {% csrf_token %}
            {% for filed in form %}
{#       filed.label这里面就是获取我们在models.py里面创建表格里面的每一个字段里面有个verbose_name这个参数的值         #}
                <label for="exampleInputEmail1">{{ filed.label }}</label>
                {{ filed }}
                {#       展示错误信息         #}
                <span style="color: red">{{ filed.errors.0 }}</span>
                <br>
            {% endfor %}
            <button type="submit" class="btn btn-success">提交</button>
        </form>
    </div>
{% endblock %}

{% block js %}

{% endblock %}

后端代码

admin_role.py:

from django.core.exceptions import ValidationError
from django.shortcuts import render, redirect
from project_one.utils import pwd_data
from project_one.utils.PageData import PageData
from django import forms
from project_one import models


# Create your views here.
def admin(request):
    data_list = models.AdminRole.objects.all()
    page_object = PageData(request, data_list)
    content = {
        "data_list": page_object.page_queryset,
        "page_string": page_object.page_html()
    }
    return render(request, "admin/admin_list.html", content)


class AdminAddModelForm(forms.ModelForm):
    # 当前变量名如果和数据表字段一致,则会覆盖,如果不同名,则会添加。
    # 我们的数据库里面没有new_password字段, 所以会添加。
    # 这个是用来做确认密码框用的, 创建账号的时候, 有输入密码和确认密码两个框, 之后判断的时候得确保两个输入框里面的密码是一致的, 账号才能被创建。
    new_password = forms.CharField(widget=forms.PasswordInput, label="确认密码")

    class Meta:
        model = models.AdminRole
        # 页面当中的输入框会按照列表的顺序进行展示
        fields = ['username', 'password', "new_password", "role"]
        # 为密码框添加属性, 将它设置为密码输入框, 意味着之后在密码框里面输入数据的时候, 全部都是······这样展示。
        widgets = {
            "password": forms.PasswordInput
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for item, field in self.fields.items():
            # 给输入框增加属性
            field.widget.attrs = {'class': 'form-control'}

    # 我们对密码那栏进行操作, 我们对密码框里面的内容进行加密处理并且存入数据库
    def clean_password(self):
        password = self.cleaned_data["password"]
        # 给密码加密, 用md5加密算法
        return pwd_data.md5(password)

    # 我们对确认密码那栏进行操作, 我们对确认密码框里面的内容进行加密处理并且存入数据库
    def clean_new_password(self):
        # 给确认密码进行加密
        new_password = pwd_data.md5(self.cleaned_data["new_password"])
        # 这里获取到的密码, 是已经加密过的, 因为上面的clean_password函数里面已经加密过pwd了。
        pwd = self.cleaned_data["password"]
        if pwd != new_password:
            raise ValidationError("两次密码不一致")
        return new_password


def admin_add(request):
    title = "添加账号"
    if request.method == "GET":
        form = AdminAddModelForm()
        content = {
            "title": title,
            "form": form
        }
        return render(request, "admin/admin_operation.html", content)
    form = AdminAddModelForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect("/admin_list/")
    return render(request, "admin/admin_operation.html", {"title": title, "form": form})


class AdminModifyModelForm(forms.ModelForm):
    class Meta:
        model = models.AdminRole
        fields = ['username', 'role']

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


def admin_modify(request, nid):
    title = "修改账号"
    obj = models.AdminRole.objects.filter(id=nid).first()
    if request.method == "GET":
        form = AdminModifyModelForm(instance=obj)
        content = {
            "title": title,
            "form": form
        }
        return render(request, "admin/admin_operation.html", content)
    form = AdminModifyModelForm(request.POST, instance=obj)
    if form.is_valid():
        form.save()
        return redirect("/admin_list/")
    return render(request, "admin/admin_operation.html", {"title": title, "form": form})


class AdminResetPwdModelForm(forms.ModelForm):
    new_second_password = forms.CharField(widget=forms.PasswordInput, label="确认密码")

    class Meta:
        model = models.AdminRole
        fields = ['password']
        widgets = {
            "password": forms.PasswordInput
        }

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

    def clean_password(self):
        pwd = self.cleaned_data["password"]
        return pwd_data.md5(pwd)

    def clean_new_password(self):
        new_second_password = pwd_data.md5(self.cleaned_data["new_second_password"])
        pwd = self.cleaned_data["password"]
        if pwd != new_second_password:
            raise ValidationError("两次不一致")
        return new_second_password


def admin_reset_pwd(request, nid):
    title_object = models.AdminRole.objects.filter(id=nid).first()
    title = f"重置<{title_object.username}>密码"
    if request.method == "GET":
        form = AdminResetPwdModelForm(instance=title_object)
        content = {"title": title, "form": form}
        return render(request, "admin/admin_operation.html", content)
    form = AdminResetPwdModelForm(request.POST, instance=title_object)
    if form.is_valid():
        form.save()
        return redirect("/admin_list/")
    return render(request, "admin/admin_operation.html", {"title": title, "form": form})


def admin_del(request, nid):
    models.AdminRole.objects.filter(id=nid).delete()
    return redirect("/admin_list/")

pwd_data.py:

import hashlib

SECRET_KEY = 'django-insecure-m@31x($s*0tgzm0$2(ct6izu)8oe$xa)@k7(&*7tkr*g(dbl)5'


def md5(data):
    obj_md5 = hashlib.md5(SECRET_KEY.encode('utf-8'))
    obj_md5.update(data.encode('utf-8'))
    return obj_md5.hexdigest()

urls.py:

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role

urlpatterns = [
    path("", depart.index),
    path("depart/", depart.depart),
    path("depart/add/", depart.add_depart),
    path("depart/<int:nid>/modify/", depart.depart_modify),
    path("depart/<int:nid>/del/", depart.del_depart),
    path("user/", user.user_info),
    path("user/add/", user.user_add),
    path("user/<int:nid>/modify/", user.user_modify),
    path("user/<int:nid>/del/", user.user_del),
    path("user/add/modelform", user.user_add_modelform),
    path("user/<int:nid>/modify/modelform", user.user_modify_modelform),
    path("assets_list/", assets.assets),
    path("assets/add/", assets.assets_add),
    path("assets/<int:nid>/modify/", assets.assets_modify),
    path("assets/<int:nid>/del/", assets.assets_del),
    path("admin_list/", admin_role.admin),
    path("admin/add/", admin_role.admin_add),
    path("admin/<int:nid>/modify/", admin_role.admin_modify),
    path("admin/<int:nid>/reset/pwd/", admin_role.admin_reset_pwd),
    path("admin/<int:nid>/del/", admin_role.admin_del)
]

七、运行结果

打开网页之后, 点击平台用户里面的登录账号。

在这里插入图片描述

进入到账号管理页面:

在这里插入图片描述

我们添加一个账号:

在这里插入图片描述

成功添加账号:

在这里插入图片描述

我们尝试修改数据:

我们将张三的角色改为领导:

在这里插入图片描述

修改成功:

在这里插入图片描述

我们尝试重置密码:

在这里插入图片描述

密码重置成功:

在这里插入图片描述

这个里面看不到密码, 因为在admin_list.html里面把它写成了******给它隐藏了。密码的数据是被加密过后存到数据库里面去的, 所以需要查看数据库里面的密码那个字段里面的值是否变化, 如果变化了就代表成功了。或者说在后端代码admin_role的modelform自定义校验类里面的clean的校验方法里面输出密码的内容, 也可以查看。

我们删除张三的数据:

在这里插入图片描述

数据删除成功。

以上就是关于账号管理功能, 代码和之前写的代码, 思路和逻辑都相差不大, 如果在写代码的时候遇到问题, 可以先翻一翻前面的文章去看是否有类似实现功能的代码。这篇文章的案例, 相当于是对以前的知识点进行了总结, 综合运用。不过在做账号管理功能的时候, 也有写细节需要注意。

以上就是Django的账号管理功能的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2344005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

月之暗面开源 Kimi-Audio-7B-Instruct,同时支持语音识别和语音生成

我们向您介绍在音频理解、生成和对话方面表现出色的开源音频基础模型–Kimi-Audio。该资源库托管了 Kimi-Audio-7B-Instruct 的模型检查点。 Kimi-Audio 被设计为通用的音频基础模型&#xff0c;能够在单一的统一框架内处理各种音频处理任务。主要功能包括&#xff1a; 通用功…

IDEA配置将Servlet真正布署到Tomcat

刚开始只能IDEA运行完Servlet web application 并保持IDEA运行才能通过浏览器访问到我的Servlet&#xff0c;跟想象中的不一样&#xff0c;不应该是IDEA运行完项目以后只要打开Tomcat就能访问吗&#xff1f;事实时运行完项目只要关掉IDEA就不能再访问到应用了&#xff0c;而且T…

刚体运动 (位置向量 - 旋转矩阵) 笔记 1.1~1.3 (台大机器人学-林沛群)

目录 1. 理解刚体的“自由度”&#xff08;Degrees of Freedom, DOF&#xff09; 1.1 平面运动 (2D) 1.2 空间运动 (3D) 2. 统一描述&#xff1a;引入“体坐标系”&#xff08;Body Frame&#xff09; 3. 从“状态”到“运动”&#xff1a;引入微分 3.1 补充&#xff1a;…

openAICEO山姆奥特曼未来预测雄文之三个观察

《三个观察》 山姆奥特曼 这篇文章主要讲的是关于AGI&#xff08;人工通用智能&#xff09;的未来发展及其对社会的影响&#xff0c;用大白话总结如下&#xff1a; 核心观点&#xff1a; AGI是什么&#xff1f; AGI是一种能像人类一样解决各种复杂问题的智能系统&#xff0c;比…

比象AI创作系统,多模态大模型:问答分析+AI绘画+管理后台系统

比象AI创作系统是新一代集智能问答、内容创作与商业运营于一体的综合型AI平台。本系统深度融合GPT-4.0/GPT-4o多模态大模型技术&#xff0c;结合实时联网搜索与智能分析能力&#xff0c;打造了从内容生产到商业变现的完整闭环解决方案。 智能问答中枢 系统搭载行业领先的对话…

Docker-高级使用

前言 书接上文Docker-初级安装及使用_用docker安装doccano-CSDN博客&#xff0c;我们讲解了Docker的基本操作&#xff0c;下面我们讲解的是高级使用&#xff0c;请大家做好准备&#xff01; 大家如果是从初级安装使用过来的话&#xff0c;建议把之前镜像和搭载的容器数据卷里面…

计算机网络 | Chapter1 计算机网络和因特网

&#x1f493;个人主页&#xff1a;mooridy-CSDN博客 &#x1f493;文章专栏&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f339;关注我&#xff0c;和我一起学习更多计算机网络的知识 &#x1f51d;&#x1f51d; 目录 …

开源项目实战学习之YOLO11:ultralytics-cfg-datasets-Objects365、open-images-v7.yaml文件(六)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 medical - pills.yaml 通常用于配置与医学药丸检测任务相关的参数和信息 Objects365.yaml 用于配置与 Objects365 数据集相关信息的文件。Objects365 数据集包含 365 个不同的物体类别…

蚂蚁集团“Plan A”重磅登场,开启AI未来

近期&#xff0c;蚂蚁集团面向全球高潜AI人才&#xff0c;正式发布顶级专项招募计划——“Plan A”。作为其“蚂蚁星”校招体系的全新升级模块&#xff0c;Plan A聚焦人工智能领域科研精英&#xff0c;旨在与全球高校AI研究者协同突破AGI前沿&#xff0c;共绘技术未来图谱。 蚂…

高中数学联赛模拟试题精选第18套几何题

在 △ A B C \triangle ABC △ABC 中, A B < A C AB< AC AB<AC, 点 K K K, L L L, M M M 分别是边 B C BC BC, C A C A CA, A B AB AB 的中点. △ A B C \triangle ABC △ABC 的内切圆圆心为 I I I, 且与边 B C BC BC 相切于点 D D D. 直线 l l l 经过线段…

Java 富文本转word

前言&#xff1a; 本文的目的是将传入的富文本内容(html标签&#xff0c;图片)并且分页导出为word文档。 所使用的为docx4j 一、依赖导入 <!-- 富文本转word --><dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId&…

多模态大语言模型arxiv论文略读(四十三)

InteraRec: Screenshot Based Recommendations Using Multimodal Large Language Models ➡️ 论文标题&#xff1a;InteraRec: Screenshot Based Recommendations Using Multimodal Large Language Models ➡️ 论文作者&#xff1a;Saketh Reddy Karra, Theja Tulabandhula …

GPU加速-系统CUDA12.5-Windows10

误区注意 查看当前系统可支持的最高版本cuda&#xff1a;nvidia-smi 说明&#xff1a; 此处显示的12.7只是驱动对应的最高版本&#xff0c;不一定是 / 也不一定需要是 当前Python使用的版本。但我们所安装的CUDA版本需要 小于等于它&#xff08;即≤12.7&#xff09;因此即使…

kafka课后总结

Kafka是由LinkedIn开发的分布式发布 - 订阅消息系统&#xff0c;具备高吞吐量、低延迟、可扩展性、持久性、可靠性、容错性和高并发等特性。其主要角色包括Broker、Topic、Partition、Producer、Consumer、Consumer Group、replica、leader、follower和controller。消息系统中存…

【股票系统】使用docker本地构建ai-hedge-fund项目,模拟大师炒股进行分析。人工智能的对冲基金的开源项目

股票系统: https://github.com/virattt/ai-hedge-fund 镜像地址: https://gitcode.com/gh_mirrors/ai/ai-hedge-fund 项目地址: https://gitee.com/pythonstock/docker-run-ai-hedge-fund 这是一个基于人工智能的对冲基金的原理验证项目。本项目旨在探讨利用人工智能进行…

施工安全巡检二维码制作

进入新时代以来&#xff0c;人们对安全的重视程度越来越高。特别在建筑施工行业&#xff0c;安全不仅是关乎着工人的性命&#xff0c;更是承载着工人背后家庭的幸福生活。此时就诞生了安全巡检的工作&#xff0c;而巡检过程中内容庞杂&#xff0c;安全生产检查、隐患排查、施工…

基于 Google Earth Engine (GEE) 的土地利用变化监测

一、引言 土地利用变化是全球环境变化的重要组成部分&#xff0c;对生态系统、气候和人类社会产生深远影响。利用遥感技术可以快速、准确地获取土地利用信息&#xff0c;监测其变化情况。本文将详细介绍如何使用 GEE 对特定区域的 Landsat 影像进行处理&#xff0c;实现土地利…

BT169-ASEMI无人机专用功率器件BT169

编辑&#xff1a;ll BT169-ASEMI无人机专用功率器件BT169 型号&#xff1a;BT169 品牌&#xff1a;ASEMI 封装&#xff1a;SOT-23 批号&#xff1a;最新 引脚数量&#xff1a;3 特性&#xff1a;单向可控硅 工作温度&#xff1a;-40℃~150℃ BT169单向可控硅&#xff…

AI图像编辑器 Luminar Neo 便携版 Win1.24.0.14794

如果你对图像编辑有兴趣&#xff0c;但又不想花费太多时间学习复杂的软件操作&#xff0c;那么 Luminar Neo 可能就是你要找的完美工具。作为一款基于AI技术的创意图像编辑器&#xff0c;Luminar Neo简化了复杂的编辑流程&#xff0c;即使是没有任何图像处理经验的新手&#xf…

发币流程是什么,需要多少成本?

这是一个专注于Web3相关开发的账号&#xff0c;具体会讲解步骤以及开发方案 偶尔会有科普&#xff0c;有兴趣的可以点右上角关注一下 发币&#xff08;发行数字货币&#xff09;的流程通常涉及技术实现、法律合规、经济模型设计等多个环节&#xff0c;以下是关键步骤的简要说明…