Django-用户登录

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

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的模版技术

<!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 视图函数
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组件
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": "密码"})
    )

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玫瑰90

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值