Django-用户登录

1.在Django的模型(models)创建表结构

python 复制代码
class ActiveBaseModel(models.Model):
    active = models.SmallIntegerField(verbose_name="状态", default=1, choices=((1, "激活"), (0, "删除"),))

    class Meta:
        abstract = True


class Administrator(ActiveBaseModel):
    """管理员表"""
    username = models.CharField(verbose_name='用户名', max_length=32, db_index=True)
    password = models.CharField(verbose_name="密码", max_length=64)
    mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True)
    create_time = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)


class Level(ActiveBaseModel):
    """ 级别表 """
    title = models.CharField(verbose_name="标题", max_length=32)
    percent = models.IntegerField(verbose_name="折扣")


class Customer(ActiveBaseModel):
    """ 客户表 """
    username = models.CharField(verbose_name="用户名", max_length=32, db_index=True)
    password = models.CharField(verbose_name="密码", max_length=64)
    mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True)
    balance = models.DecimalField(verbose_name="账户余额", default=0, max_digits=10, decimal_places=2)
    level = models.ForeignKey(verbose_name="级别", to="Level", on_delete=models.CASCADE)
    create_date = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)
    creator = models.ForeignKey(verbose_name="创建者", to="Administrator", on_delete=models.CASCADE)

注意的点

1.创建表结构其中在元类中设置 abstract = True 属性后 数据库就不创建这个ActiveBaseModel这个表

2.用户登录

2.1前端代码

这个项目是Django前后端不分离的,这个用到django的模版技术

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
</head>
<body>
<style>
    .box {
        width: 480px;
        border: 1px solid silver;
        margin-left: auto;
        margin-right: auto;
        margin-top: 100px;
        padding: 40px 80px 40px 80px;
        box-shadow: 10px 10px 10px rgb(0 0 0 /5%);

    }

    .text {
        text-align: center;
    }

    .sms {
        float: right;
    }
</style>
<div class="box">
    <h1 class="text">用户登录</h1>
    <form method="post" novalidate>
        {% csrf_token %}
        {% for filed in form %}
            <div class="form-group" style="position:relative; margin-bottom: 20px">
                <label>{{ filed.label }}</label>
                {{ filed }}
                <label style="position: absolute">{{ filed.errors.0 }}</label>
            </div>
        {% endfor %}
        <button type="submit" class="btn btn-primary">登录</button>
        <span style="color: red">{{ error }}</span>
        <a href="{% url 'sms_login' %}" class="sms">短信登录</a>
    </form>
</div>

</body>
</html>

2.2 后端代码

1.用户登录引用了form组件 前端通过访问url地址 发送get请求给后端, 后端收到get请求的数据包,发送html代码给前端进行渲染。

2.前端输入对于的用户名和密码后, 提交表单(表单是post请求),后端收到post请求的数据包后,传给form对象校验。

3.数据库校验是否存在用户和密码。

4.设置ssession返回会浏览器

2.2.1 视图函数
python 复制代码
def login(request):
    if request.method == 'GET':
        form = LoginForm()
        return render(request, 'login.html', {"form": form})
    form = LoginForm(data=request.POST)
    if not form.is_valid():
        return render(request, 'login.html', {"form": form})
    data_dict = form.cleaned_data
    role = data_dict.pop("role")

    if role == "1":
        user_object = models.Administrator.objects.filter(active=1).filter(**data_dict).first()
    else:
        user_object = models.Customer.objects.filter(active=1).filter(**data_dict).first()

    # 校验失败
    if not user_object:
        form.add_error("username", "用户名或密码错误")
        return render(request, 'login.html', {'form': form})

    # 校验成功
    mapping = {"1": "ADMIN", "2": "CUSTOMER"}
    request.session['user_info'] = {'role': mapping[role], 'name': user_object.username, 'id': user_object.id}
    return redirect('/home/')
2.2.2 django中的forms组件
python 复制代码
class LoginForm(forms.Form):
    role = forms.ChoiceField(
        label="角色",
        required=True,
        choices=(("2", "客户"), ("1", "管理员")),
        widget=forms.Select(attrs={"class": "form-control"})
    )
    username = forms.CharField(
        label="用户名",
        required=True,
        widget=forms.TextInput(attrs={"class": 'form-control', "placeholder": "用户名"})
    )
    password = forms.CharField(
        label="密码",
        required=True,
        max_length=10,
        min_length=6,
        widget=forms.PasswordInput(attrs={"class": "form-control", "placeholder": "密码"})
    )
相关推荐
a努力。4 分钟前
宇树Java面试被问:数据库死锁检测和自动回滚机制
java·数据库·elasticsearch·面试·职场和发展·rpc·jenkins
数据知道6 分钟前
PostgreSQL实战:详解权限设置与管理全流程
数据库·postgresql
Dontla25 分钟前
Database Schema Introduction (structure of data, NoSQL schema)
数据库·nosql
2401_8322981027 分钟前
存算分离2.0,阿里云EMR Serverless破解数据处理瓶颈
数据库
Maggie_ssss_supp31 分钟前
Linux-MySQL日志管理
数据库·mysql
喜欢吃豆36 分钟前
PostgreSQL 高维向量存储架构深度解析:架构限制、核心原理与行业解决方案
数据库·人工智能·postgresql·架构·2025博客之星
茁壮成长的露露37 分钟前
Percona Backup for MongoDB备份恢复操作
数据库·mongodb
l1t38 分钟前
一个在postgresql中运行很快,但是在duckdb中运行很慢的SQL
数据库·sql·postgresql·duckdb
曹牧41 分钟前
Oracle:增加十分钟
数据库·oracle
码界奇点1 小时前
深入解析MySQL9主从复制架构详解从原理到实战
数据库·sql·架构·可用性测试