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": "密码"})
)