zoukankan      html  css  js  c++  java
  • 十、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}}&nbsp&nbsp{{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})
    
  • 相关阅读:
    Floydtemplate 示例
    dfa hdu 2222 AC自动机示例
    oj 中的 G++ 与 C++ 的区别
    System.Diagnostics.Process.Start(Info)
    自动关闭messagebox
    获取外部程序进程的SQL语句
    php 阿拉伯数字转中文数字 方法
    最新jQuery CHM版中文帮助文档
    parent.myFrame.cols ff 子窗体取得(访问)父窗体中另一子窗体的ID
    Jquery JS 正确的比较两个数字大小的方法
  • 原文地址:https://www.cnblogs.com/little-turtle/p/7815680.html
Copyright © 2011-2022 走看看