Django课程——用户表的基本操作
- 模板的继承
- 用户管理
- 用户列表展示
- 新建用户
- Django组件
- 原始方法【麻烦,太原始】
- form组件
- modelform组件
- 使用modelsform组件编写添加页面
模板的继承
(1)先写一个页面模板————这个案例中的模板基本上就是一个导航栏,然后就是链接的框架导入——占位符可以用在任何需要的地方
代码:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 为啥只能使用这种引用,好无语,配置文件中应该咋改嘞-->
<!-- <link rel="stylesheet" type="text/css" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}">-->
<!-- <link rel="stylesheet" type="text/css" href="../static/plugins/bootstrap-3.4.1-dist/css/bootstrap.css">-->
<!-- 去除圆角样式-->
<!-- <style>-->
<!-- .navbar{ -->
<!-- border-radius:0;-->
<!-- }-->
<!-- </style>-->
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css'%}">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">联通用户管理系统</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/depart/list/">部门管理 </a></li>
<li><a href="/user/list/">用户管理 </a></li>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">登录</a></li>
<li class="dropdown " >
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">庞恬 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">个人资料</a></li>
<li><a href="#">我的信息</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">注销</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div>
{% block content %}{% endblock %}
</div>
<!--这个不知道会不会有效哦-->
<script src="{% static 'js/jquery-3.5.1/jquery-3.5.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>
</body>
</html>
(2)继承模板,并完整添加占位符的内容
代码:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 为啥只能使用这种引用,好无语,配置文件中应该咋改嘞-->
<!-- <link rel="stylesheet" type="text/css" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}">-->
<!-- <link rel="stylesheet" type="text/css" href="../static/plugins/bootstrap-3.4.1-dist/css/bootstrap.css">-->
<!-- 去除圆角样式-->
<!-- <style>-->
<!-- .navbar{ -->
<!-- border-radius:0;-->
<!-- }-->
<!-- </style>-->
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css'%}">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">联通用户管理系统</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/depart/list/">部门管理 </a></li>
<li><a href="/user/list/">用户管理 </a></li>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">登录</a></li>
<li class="dropdown " >
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">庞恬 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">个人资料</a></li>
<li><a href="#">我的信息</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">注销</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div>
{% block content %}{% endblock %}
</div>
<!--这个不知道会不会有效哦-->
<script src="{% static 'js/jquery-3.5.1/jquery-3.5.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>
</body>
</html>
用户管理
用户列表展示
(1)在urls中编写
代码:
urlpatterns = [
#用户管理
path('user/list/', views.user_list),
]
(2)在views.py中编写函数
#用户管理
#用户列表显示
def user_list(request):
#获取所有用户列表
query_set=models.UseInfo.objects.all();
#循环遍历
#for obj in query_set:
#strftime("%Y-%m-%d")取时间显示函数
#get_列名_display()————————找这种性别类型,已经用元组定义了的,choices
#所属部门——外键连接,显示方法
#obj.depart_id 数据库中原始的数据
#关联系跨表——取外键对应值——对象
#obj.depart.title
#原始方法拿
#
#xx=models.Department.objects.filter(id=obj.depart_id).first()
#xx.title
# print(obj.id,obj.name,obj.account,obj.from_time.strftime("%Y-%m-%d"),obj.get_gender_display(),obj.depart.title)
return render(request,'user_list.html',{"query_set":query_set})
(3)继承了模板的用户列表
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div style="margin-bottom: 10px">
<!-- 新建部门按钮-->
<a class="btn btn-success" href="#" >
<span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
新建用户
</a>
</div>
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
<span class="glyphicon glyphicon-list" aria-hidden="true"></span>
用户列表
</div>
<div class="panel-body">
<p>欢迎进入到用户管理页面,请安全操作!</p>
</div>
<!-- Table -->
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>账户余额</th>
<th>入职时间</th>
<th>所属部门</th>
<th>性别</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- 数据库部门列表循环-->
{% for obj in query_set %}
<tr>
<td>{{obj.id}}</td>
<td>{{obj.name}}</td>
<td>{{obj.password}}</td>
<td>{{obj.age}}</td>
<td>{{obj.account}}</td>
<td>{{obj.from_time|date:"Y-m-d"}}</td>
<td>{{obj.depart.title}}</td>
<td>{{obj.get_gender_display}}</td>
<td>
<!-- Django框架中传递参数的正则表达式-->
<a class="btn btn-primary btn-xs" href="#">编辑</a>
<!-- 通过get请求传递参数跳转页面-->
<a class="btn btn-danger btn-xs" href="#" >删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock%}
(4)入职时间,性别,部门外键的用法,看代码的时候要发现——在函数中和在页面渲染中的方法不一样。
- 入职时间:
obj.from_time.strftime("%Y-%m-%d")
<td>{{obj.from_time|date:"Y-m-d"}}</td>
- 性别:
在表结构中的定义
obj.get_gender_display()
<td>{{obj.get_gender_display}}</td>
- 部门属性——它是一个外键:在框架中生成的表名称将自动加一个id,表示这是与其他表连接的
depart=models.ForeignKey(to="Department",to_field="id",on_delete=models.CASCADE)
<td>{{obj.depart.title}}</td>
效果图:
新建用户
Django组件
原始方法【麻烦,太原始】
form组件
用法:(此代码只是用来展示用法——不可直接复制)
在views中定义一个类:该类封装所有的属性——实例化后来使用
#views.py文件
class MyForm(Form):
user=forms.CharField(widget=formsInput)
pwd=forms.CharField(widget=formsInput)
email=forms.CharField(widget=formsInput)
....
def user_add(request):
if request.method=="GET":
#直接实例化,然后再HTML中去使用
form=MyForm()
return render(request,'user_add.html',{'form':form})
<!--html文件-->
<form method='post'>
<!--不用在像以前一样,写input框,直接封装为特定的框-->
<!--{{form.user}}-->
<!--{{form.pwd}}-->
<!--也可以直接循环form来简洁代码-->
{% for field in form %}
{{field}}
{% endfor %}
</form>
modelform组件
用法:它是基于models.py文件来的
也就是基于表
#views.py文件
class MyForm(ModelForm):
#可在自定义
xx=form.CharField...("...")
class Meta:
model=UserInfo
fields=["name","password","age","xx".....]
def user_add(request):
if request.method=="GET":
#直接实例化,然后再HTML中去使用
form=MyForm()
return render(request,'user_add.html',{'form':form})
<!--html文件-->
<form method='post'>
<!--不用在像以前一样,写input框,直接封装为特定的框-->
<!--{{form.user}}-->
<!--{{form.pwd}}-->
<!--也可以直接循环form来简洁代码-->
{% for field in form %}
{{field}}
{% endfor %}
</form>
使用modelsform组件编写添加页面
原始方法的缺点:
- 用户提交数据没有校验
- 页面上没有响应的提示错误
- 页面上的字段需要我们都写一遍,太重复
- 关联的数据,手动去获取并要循环展示在页面上
(1)在urls.py中编写
代码如下:
urlpatterns = [
path('user/model/form/add/',views.user_model_form_add),
]
(2)在view.py编写
代码如下:
#############################################modelForm实例####################################################
#modelForm实例
from django import forms
class UserModelForm(forms.ModelForm):
class Meta:
model = models.UseInfo
fields = ["name","password","age","account","from_time","depart","gender"]
# widgets={
# "name":forms.TextInput(attrs={"class":"form-control"}),
# "password": forms.PasswordInput(attrs={"class": "form-control"}),
#
#
# }
def __init__(self,*args,**kwargs):
super().__init__(*args ,**kwargs)
#循环找到所有插件,添加了class=“form-control”样式
for name ,field in self.fields.items():
# print(name,field)
#某一项去除样式
# if name=="password":
# continue
field.widget.attrs = {"class":"form-control","placeholder":field.label}
(3)在HTML中编写
代码如下:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"> 新建用户 </h3>
</div>
<div class="panel-body">
<form method="post">
<!-- 隐含参数-->
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label >{{ field.label }}</label>
{{ field }}
<!-- <input type="text" class="form-control" placeholder="标题" name="user">-->
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提 交</button>
</form>
</div>
</div>
</div>
{% endblock %}
<!-- <form method="post">-->
<!-- {% csrf_token %}-->
<!--<!– label通过表中中文命名连接(verbose_name='姓名')–>-->
<!-- {% for field in form %}-->
<!-- {{ field.label}}:{{field}}-->
<!-- {% endfor %}-->
<!--<!– {{form.name.label}}:{{form.name}}–>-->
<!--<!– {{form.password.label}}:{{form.password}}–>-->
<!--<!– {{form.age.label}}:{{form.age}}–>-->
<!-- </form>-->
(4)widgets.py源码
(5)数据校验
【单独补!!!!!!!】
(6)最终页面