django 学习(十四)—— 设计签到功能
需求:给每一条发布会提供一个“签到”链接
1.在.../templates/event_manage.html页面,增加一列签到链接
当单击“sign”链接时,路径会默认跳转到“/sign_index/{{event.id}}/”路径。其中,{{event.id}}为发布会的id。target="{{event.id}}_blank"属性设置链接在新窗口打开。
2.在.../guest/urls.py文件中添加签到页面路径的路由。
说明:1. re_path和path作用是一样的,re_path是在写url的时候可以用正则表达式,功能更强大。
2. 在正则表达式中定义变量,需要使用圆括号括起来。这个参数是有名字的,那么需要使用'?P<参数名字>'。然后在后面添加正则表达式的规则。
3.创建sign_index()视图函数
get_object_or_404(),它默认调用Django的table.objects.get()方法,如果查询的对象不存在,则会抛出一个Http404异常。这就省去了对table.objects.get()方法的异常断言。
4.创建签到页面../templates/sign_index.html
DOCTYPE html>
<html lang="zh-CN">
<head>
{% load bootstrap3 %}
{% bootstrap_javascript %}
{% bootstrap_css %}
<meta charset="UTF-8">
<title>Sign Indextitle>
head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="contain">
<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="#">{{ user }}a> li>
<li><a href="/logout/">退出a> li>
ul>
div>
div>
nav>
<div class="page-header" style="padding-top: 80px;">
<div id="navbar" class="navbar-collapse collapse">
<form class="navbar-form" method="post" action="/sign_index_action/{{ event.id }}/">
<div class="form-group">
<input name="phone" type="text" placeholder="输入手机号" class="form-control">
div>
<button type="submit" class="btn btn-success">签到button>
<font color="red">
<br>{{ hint }}
<br>{{ guest.realname }}
<br>{{ guest.phone }}
font>
form>
div>
div>
body>
html>
当签到成功时,{{guest.realname}}和{{guest.phone}}将显示嘉宾的姓名和手机号。
点击签到按钮,查看签到页面:
5.设计签到动作
打开.../guest/urls.py文件,添加签到动作路径的路由
创建sign_index_action()视图函数
# 签到动作 @login_required def sign_index_action(request, eid): event = get_object_or_404(Event, id=eid) phone = request.POST.get('phone', '') print(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=eid) 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=eid) # 判断嘉宾的签到状态是否为True(1) if result.sign: return render(request, 'sign_index.html', {'event': event, 'hint': 'user has sign in. '}) else: # 嘉宾未签到,修改签到状态为1(已签到) Guest.objects.filter(phone=phone, event_id=eid).update(sign='1') return render(request, 'sign_index.html', {'event': event, 'hint': 'sign in success!', 'guest': result})
需求:将当前发布的嘉宾数和已签到数显示在签到页面上。
修改../views.py中sign_index_action()视图函数
打开浏览器: