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": "密码"})
    )
相关推荐
徐子元竟然被占了!!5 小时前
Linux-systemctl
linux·数据库·oracle
YJlio7 小时前
Active Directory 工具学习笔记(10.8):AdInsight——保存与导出(证据留存、共享与二次分析)
数据库·笔记·学习
suoyue_zhan7 小时前
GBase的管理监控平台GEM实践指南
数据库
哈哈老师啊8 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
小小8程序员8 小时前
Redis-10
数据库·redis·缓存
liuzhilongDBA8 小时前
从collation mismatch异常到其原理
数据库·version·glibc·postgres·collation
梁萌8 小时前
MySQL数据库分库分表介绍
数据库·mysql·shardingsphere·分库分表
占疏9 小时前
dify API访问工作流/聊天
开发语言·数据库·python
Cat God 00710 小时前
SQL使用及注意事项
数据库·sql·mysql