十、guest_and_sign_page_dev
简单的嘉宾管理页面开发
1、页面点击【嘉宾】跳转到嘉宾管理页面
urls.py 文件添加跳转路径
url(r'^guest_manage/',views.guest_manage),
2、views.py文件添加视图文件
@login_required
def guest_manage(request):
if request.method == "GET":
guest_list = Guest.objects.all()
print(guest_list)
username = request.session.get('user')
return render(request,'guest_manage.html',{'p_user':username,'guests':guest_list})
else:
return render(request,'new_index.html')
3、新建一个简单的guest_manage.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>guest page</title>
</head>
<body>
<h1> guest page</h1>
</body>
</html>
修改guest_manage.html文件
1、添加头部信息与bootstraps上面模板引用
<html lang="zh-CN">
<head>
<!-- 头部的引用-->
{% load bootstrap3 %} <!-- 在setting文件里面已经引入了bootstrap3,所以直接引用本地的bootstrap3-->
{% bootstrap_css %}
{% bootstrap_javascript %}
<title>Guest Manage</title>
</head>
<!-- 导航栏 -->
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/guest_manage/">Guest Manage System</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/event_manage/">发布会</a></li>
<li class="active"><a href="#about">嘉宾</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">{{user}}</a></li>
<li><a href="/logout/">退出</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container theme-showcase" role="main">
<!--列表显示 -->
<div class="row">
<div class="col-md-6">
<table class="table table-striped">
<thead>
<tr>
<th>id</th>
<th>名称</th>
<th>手机</th>
<th>Email</th>
<th>签到</th>
<th>发布会id</th>
</tr>
</thead>
<tbody>
{% for guest in guests %}
<tr>
<td>{{ guest.id }}</td>
<td>{{ guest.realname }}</td>
<td>{{ guest.phone }}</td>
<td>{{ guest.email }}</td>
<td>{{ guest.sign }}</td>
<td>{{ guest.event }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<!-- 列表分页器 -->
<div class="pagination">
<span class="step-links">
{% if guests.has_previous %}
<a href="?phone={{ phone }}&page={{ guests.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ guests.number }} of {{ guests.paginator.num_pages }}.
</span>
{% if guests.has_next %}
{% if phone %}
<a href="?phone={{ phone }}&page={{ guests.next_page_number }}">next</a>
{% else %}
<a href="?page={{ guests.next_page_number }}">next</a>
{% endif %}
{% endif %}
</span>
</div>
</body>
</html>
2、页面添加搜索功能表单
guest_manage.html文件添加搜索功能
<!--发布会表单-->
<div class="page-header">
<!-- 搜索功能-->
<div id="navbar" class="navbar-collapse collapse">
<form class="navbar-form" method="get" action="/search_phone/">
<div class="form-group">
<input name="phone" type="text" placeholder="手机号" class="form-control">
</div>
<button type="submit" class="btn btn-success">搜索</button>
</form>
</div><!--/.navbar-collapse -->
</div>
3、完善嘉宾--搜索功能表单
urls.py文件配置跳转路径
url(r'^search_phone/',views.guest_search),
views.py文件添加视图跳转
@login_required
def guest_search(request):
if request.method == "GET":
s_phone = request.GET.get('search_phone')
print(s_phone)
# phone= s_phone 为精确搜索,name__contains=s_name为模糊搜索
guest_list = Guest.objects.filter(phone= s_phone)
username = request.session.get('user')
return render(request,'guest_manage.html',{'p_user':username,'guests':guest_list})
else:
return render(request,'new_index.html')
views.py文件中将搜索关键字修改为search_name,相对应的html文件也要进行修改关键字一致

样式调整
调整高度
guest_mange.py文件中修改
<div id="navbar" class="navbar-collapse collapse" style="padding-top: 80px">
分页设计
1、分页器
核心:列表的查询数据
2、shell模式联系分页相关
python3 manage.py shell #进入Django的shell模式 >>> from django.core.paginator import Paginator #导入Django模块下面的分页类Paginator >>> from sign.models import Guest #导入嘉宾表的所有模型 >>> guest_list = Guest.objects.all() #导出所有的数据 >>> p = Paginator(guest_list,2) #对所有数据进行分页,每页显示2条数据
3、分页数据统计
>>> p.count #总共有几条数据 5 >>> p.page_range #分页的页数范围,分别为第1、2、3页,所以是1-4的范围 range(1, 4)
4、展示具体页面数据
第1页数据
# 进入到shell模式 # >>> p1 = p.page(1) 进入到p1页面 # >>> p1 打印p1的数据,1,2总的有两条 # <Page 1 of 3> # >>> p1.object_list 展示出来p1页面的数据 # <QuerySet [<Guest: 二>, <Guest: 一>]> # >>> for p in p1: for循环p1的数据来展示相对应的数据,这里一定要是p(p才会有数据) # ... p.phone 打印电话 # ... p.realname 打印名字 # ... # '16287123' # '二' # '21973127' # '一'
第2页数据
# 进入到shell模式 # >>> p = Paginator(guest_list,2) 分页操作 # >>> p2 = p.page(2) 进入到第2页 # >>> p2.start_index() 第几条数据是第2页的开始 # 3 # >>> p2.end_index() 第几条数据是第2页的结束 # 4 # >>> p2.has_previous() 是否有上一页 # True # >>> p2.has_next() 是否有下一页 # True # >>> p2.previous_page_number() 上一个的页数是多少 # 1 # >>> p2.next_page_number() 下一页的页数是多少 # 3
将分页器集成到代码
1、views.py 页面
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger #导入分页器模块下面的分页器类、空字符类、输入异常类
@login_required
def guest_manage(request):
username = request.session.get('user') #获取session
if request.method == "GET":
guest_list = Guest.objects.all() #获取所有的嘉宾数据
paginator = Paginator(guest_list,2) #每页2条数据进行分页
page = request.GET.get('page') #接收一个页数
#因为输入的页数中会有错误的页面、空的页数,不存在的页面,所以需要做一个异常处理
try:
contacts = paginator.page(page) #分页器下面的 页数
print(contacts)
except PageNotAnInteger: #如果输入的页面不是正常的字符串则返回第一页
# If page is not an integer ,delicer first page.
contacts = paginator.page(1)
except EmptyPage: #如果输入的是空,在返回空数据
#If page is out of range(e.g. 999),deliver last page of results.
contacts = paginator.page(paginator.num_pages)
return render(request,'guest_manage.html',{"user":username,'guests':contacts})
else:
return render(request,'new_index.html')
2、在html文件中加分页器
<!-- 列表分页器 -->
<div class="pagination">
<span class="step-links">
{% if guests.has_previous %}
<a href="?phone={{ phone }}&page={{ guests.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ guests.number }} of {{ guests.paginator.num_pages }}.
</span>
{% if guests.has_next %}
{% if phone %}
<a href="?phone={{ phone }}&page={{ guests.next_page_number }}">next</a>
{% else %}
<a href="?page={{ guests.next_page_number }}">next</a>
{% endif %}
{% endif %}
</span>
</div>
3、页面展示效果

发布会签到功能完善
1、将发布会ID带到URL地址里面
发布会sign按钮关联的到的是根据发布会的ID,所以需要将发布会的ID定义成一个变量,再关联到URL里面去即可


2 、sign页面跳转实现
urls.py文件添加路径
#利用正则表达式:?P<event_id>[0-9]+ 匹配相对应的页数,并且将页数返回给event_id这个变量
url(r'^sign_index/(?P<event_id>[0-9]+)/$',views.sign_index),
views.py文件添加相对应的页面
@login_required
def sign_index(request,event_id):
return HttpResponse("发布会ID:" +str(event_id) )
跳转页面展示

3、在sign页面返回一个签到页
views.py文件输入
@login_required
def sign_index(request,event_id):
event = get_object_or_404(Event,id = event_id)
return render(request,'sign_index.html',{'event':event})
#return HttpResponse("发布会ID:" +str(event_id) )
新建一个sign_index.html页面接收sign数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
come!!!!
</body>
</html>
页面展示

4、完善sign页面
sign_index.html页面添加如下代码完善
<html lang="zh-CN">
<head>
<!-- 头部的引用-->
{% load bootstrap3 %} <!-- 在setting文件里面已经引入了bootstrap3,所以直接引用本地的bootstrap3-->
{% bootstrap_css %}
{% bootstrap_javascript %}
<title>Guest Manage</title>
</head>
<!-- 导航栏 -->
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">{{ event.name }}</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/event_manage/">发布会</a></li>
<li><a href="/guest_manage/">嘉宾</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="">已签到:{{sign}} | 嘉宾:{{guest}}</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container theme-showcase" role="main">
<!--签到表单-->
<div class="row" style="margin-top:120px">
<div class="col-lg-6">
<form class="bs-example bs-example-form" role="form" action="/sign_index_action/{{ event.id }}/" method="post">
<div class="input-group">
<input type="text" class="form-control" placeholder="输入手机号" name="phone">
<button type="submit" class="btn btn-success">签到</button><br>
<font color="red">
<br>{{hint}}
<br>{{user.realname}}  {{user.phone}}
</font>
</div><!-- /input-group -->
</form>
</div><!-- /.col-lg-6 -->
</div><!-- /.row -->
</div> <!-- /container glyphicon glyphicon-phone border-style:none; -->
</body>
</html>
页面展示效果

5、实现签到逻辑
urls.py页面实现签到跳转
#添加签到页面
url(r'^sign_index_action/(?P<event_id>[0-9]+)/$',views.sign_index_action),
views.py页面添加签到动作的实现逻辑
#签到动作
@login_required
def sign_index_action(request,event_id):
event = get_object_or_404(Event, id=event_id)
phone = request.POST.get('phone','')
result = Guest.objects.filter(phone = phone)
if not result:
return render(request, 'sign_index.html', {'event': event,
'hint': 'phone error.'})
result = Guest.objects.filter(phone=phone,event_id=event_id)
if not result:
return render(request, 'sign_index.html', {'event': event,
'hint': 'event id or phone error.'})
result = Guest.objects.get(phone=phone,event_id=event_id)
if result.sign:
return render(request, 'sign_index.html', {'event': event,
'hint': "user has sign in."})
else:
Guest.objects.filter(phone=phone,event_id=event_id).update(sign = '1')
return render(request, 'sign_index.html', {'event': event,
'hint':'sign in success!',
'guest': result})

浙公网安备 33010602011771号