数据库就利用前面建立的gw数据库,和super表,大家新建哈
form表单下要加 {% csrf_token %} 去除csrf错误
Django连接mysql及orm操作_django连接数据库mysql_柒拾霜染的博客-CSDN博客
django设置session及登录退出案例_柒拾霜染的博客-CSDN博客
建立人员表【小,所以不区分】
将客户与商业人员放在一张表中,用id_card区分登陆之后属于什么身份
class Commodity(models.Model):
username=models.CharField(max_length=32,verbose_name='用户名')
password=models.CharField(max_length=16,verbose_name='密码')
card={
(0,'商业'),#减少占用内存
(1,'客户'),
}
idcard=models.SmallIntegerField(verbose_name='身份',choices=card)
执行数据库生成语句,并在数据库中插入两条数据,一条是商业,一条是客户
制作登陆页面
【使用用户名与密码进行登陆,将用户名,密码,身份均存入session,跳转后利用身份判断是商业人员还是客户】Django使用bootstrp插件生成html
去掉remember,更改文字,加上自己的样式【选取样式,并进行更改】这里我加了一个div和span,对宽度进行了修饰【先调试出样式】
通过url直接进去的是GET方法,当输入用户名与密码之后,用post提交表单,返回至本页面,并对接收的数据进行验证,若验证通过,则进入购物,若验证失败,则对失败原因做出提示【验证用户不存在,验证密码错误】
def index(request):
if request.method == 'GET':#通过url打开是get
form = IModelForm()
return render(request, 'index.html', {'form': form})
#这里是post,在提交表单后跳转至原地址,若检测出错,则继续填写,若一切正常
form = IModelForm(data=request.POST)#获取提交的数据
if form.is_valid(): # 校验数据【每个钩子方法走一遍,全部通过为真】
request.session['user']=form.data['username']#设置ssession
request.session['pwd']=form.data['password']
request.session['idd']=models.Commodity.objects.filter(username=form.data['username']).first().get_idcard_display()
#request.session['idd']=models.Commodity.objects.filter(username=form.data['username']).first().idcard#获取的是0或1,get_idcard_display()是提供的专门获取对应信息的
return redirect('/show/')
return render(request, 'index.html', {'form': form})
从上面的代码即可看出,使用了ModelForm
- 先导入ModelForm库
from django import forms
- 搭建使用类
class 名称(forms.ModelForm):【那些样式是从bootstrap中复制来的】
class 名称(forms.ModelForm): class Meta: model = models.表 fields = [列...] widgets = { '列': forms.输入框样式(attrs={以键值对来表示使用什么样式,比如类选择器class与其名称}) # 单独设置样式 } def __init__(self, *args, **kwargs):#固定 super().__init__(*args, **kwargs)#固定 for name, field in self.fields.items():#固定 field.widget.attrs['class'] = 'form-control'#循环给每列生成的输入框加上样式 field.widget.attrs['placeholder'] = field.label def clean_列(self): #局部钩子 self.cleaned_data["列"]#获取该列生成的输入框里的数据 raise ValidationError("错误信息")#在ModelForm中有专门的存储错误信息的列表errors def clean(self): #全局钩子错误也是存储在errors列表中,但不在像局部钩子将错误显示在输入框下,而是一个整体的位置,提示不在精细例如【账号或密码有误】
-
使用ModelForm
form = IModelForm():#以列为元素的列表形式
form = IModelForm(data=request.POST)#将表单传来的信息整合为字典形式,然后进行检测
is_valid()#对所有钩子方法进行判断
class IModelForm(forms.ModelForm):
class Meta:
model = models.Commodity
fields = ['username','password']#要生成的列
widgets = {#给单列添加样式。添加密码不可见
'password': forms.PasswordInput(attrs={'id': 'inputPassword3'}) # 单独设置样式
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():#循化给上面定义的列添加样式
field.widget.attrs['class'] = 'form-control'
field.widget.attrs['placeholder'] = field.label
#钩子方法,每个列对应一个钩子,在里面进行对每个框的信息进行检测,
#这里使用的是局部钩子,第一个钩子检测用户名是否存在
def clean_username(self):
txt_user = self.cleaned_data["username"]
# print('--------------->',txt_user)
exits = models.Commodity.objects.filter(username=txt_user).exists()
if not exits:
raise ValidationError("账号不存在")#在ModelForm中有专门的存储错误信息的列表errors
return txt_user#不写返回空
#第二个钩子检测密码是否与账号对应
def clean_password(self):
if 'username' in self.cleaned_data:#检测账号出错会删除键,self.cleaned_data['username']将不存在,所以账号存在时才会检测密码
txt_user=self.cleaned_data['username']
txt_pwd=self.cleaned_data['password']
pwd=models.Commodity.objects.filter(username=txt_user).first().password
if pwd != txt_pwd:#将输入的密码与数据库中存储的密码进行比较
raise ValidationError('密码错误')
return pwd
拷贝bootstrap的样式
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{# <link rel="stylesheet" href="bootstrap-3.4.1-dist/css/bootstrap.min.css">#}
<link rel="stylesheet" href={% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}>
<style>
.box{
width: 600px;
margin: 0 auto;
margin-top: 100px;
}
.font{
font-size: 20px;
font-weight: bold;
display: block;
margin-left: 43%;
}
</style>
</head>
<body>
<div class="box"><!-- 更改宽度 -->
<span class="font"><!-- 设置字体样式 -->
gw登陆跳转
</span>
<form class="form-horizontal" method="post" novalidate><!--novalidate 关闭浏览器校验 action不写跳转至本URL-->
{% csrf_token %}
{% for i in form %}
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">{{ i.label }}</label>
<div class="col-sm-10">
{{ i }}
<span style="color: red">{{ i.errors.0 }}</span>
</div>
</div>
{% endfor %}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default btn-primary">确认</button>
</div>
</div>
</form>
</div>
<script src={% static 'js/jquery-3.6.0.min.js' %} ></script>
<script src={% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.min.js' %}></script>
</body>
</html>
输入用户名与密码后,将用户名,密码,身份保存至session中,并跳站转至可查看页面