v1.0

需求:

  • 实现动态数据
  • 实现页面跳转
  • 实现页面可视化

HTML文件

  1. {% load static %}
  2. <!DOCTYPE html>
  3. <html lang="cn">
  4. <head>
  5. <meta charset="utf-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <meta content="haiwen" name="author" />
  8. <!-- Bootstrap Styles-->
  9. <link href="{% static 'assets/css/bootstrap.css' %} " rel="stylesheet" />
  10. <!-- FontAwesome Styles-->
  11. <link href="{% static 'assets/css/font-awesome.css' %}" rel="stylesheet" />
  12. <!-- Custom Styles-->
  13. <link href="{% static 'assets/css/custom-styles.css' %}" rel="stylesheet" />
  14. <title>{% block title%}{% endblock %}</title>
  15. </head>
  16. <body>
  17. <div id="wrapper">
  18. <nav class="navbar navbar-default top-navbar" role="navigation">
  19. <div class="navbar-header">
  20. <a class="navbar-brand"><i class="icon fa fa-plane"></i> 发布会签到系统</a>
  21. <div id="sideNav" >
  22. <i class="fa fa-bars icon"></i>
  23. </div>
  24. </div>
  25. <ul class="nav navbar-top-links navbar-right">
  26. <li class="dropdown">
  27. <a class="dropdown-toggle" data-toggle="dropdown" href="#" aria-expanded="false">
  28. <i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
  29. </a>
  30. <ul class="dropdown-menu dropdown-user">
  31. <li><a href="#"><i class="fa fa-user fa-fw"></i> User Profile</a>
  32. </li>
  33. <li><a href="#"><i class="fa fa-gear fa-fw"></i> Settings</a>
  34. </li>
  35. <li class="divider"></li>
  36. <li><a href="#"><i class="fa fa-sign-out fa-fw"></i> Logout</a>
  37. </li>
  38. </ul>
  39. <!-- /.dropdown-user -->
  40. </li>
  41. </ul>
  42. </nav>
  43. <!--/. NAV TOP -->
  44. <nav class="navbar-default navbar-side" role="navigation">
  45. <div class="sidebar-collapse">
  46. <ul class="nav" id="main-menu">
  47. <li>
  48. <a class="active-menu" href="/sgin/events"><i class="fa fa-dashboard"></i> 发布会</a>
  49. </li>
  50. <li>
  51. <a href="/sgin/guests"><i class="fa fa-desktop"></i> 嘉宾</a>
  52. </li>
  53. </ul>
  54. </div>
  55. </nav>
  56. <!-- /. NAV SIDE -->
  57. <div id="page-wrapper">
  58. <div class="header">
  59. <div class="page-header">
  60. {% block maintitle %}{% endblock %} <small></small>
  61. </div>
  62. </div>
  63. <div id="page-inner" class="panel-body">
  64. {% block content %}
  65. {% endblock %}
  66. <footer><p>Author:haiwen. <a href="https://ke.qq.com/course/3135766" target="_blank">松勤测试开发课程</a></p>
  67. </footer>
  68. </div>
  69. <!-- /. PAGE INNER -->
  70. </div>
  71. <!-- /. PAGE WRAPPER -->
  72. </div>
  73. <!-- jQuery Js -->
  74. <script src="{% static 'assets/js/jquery-1.10.2.js' %}"></script>
  75. <!-- Bootstrap Js -->
  76. <script src="{% static 'assets/js/bootstrap.min.js' %}"></script>
  77. <!-- Custom Js -->
  78. <script src="{% static 'assets/js/custom-scripts.js' %}"></script>
  79. <script>
  80. $(document).ready(
  81. $('#main-menu>li>a').each(function (){
  82. $(this).attr('class',''); //先取消选中
  83. let current_href = window.location.pathname
  84. if(current_href === $(this).attr('href')){
  85. $(this).attr('class','active-menu');
  86. }
  87. }),
  88. )
  89. </script>
  90. </body>
  91. </html>

{% block content %}

发布会名称:{{ event.name }}
发布会地址:{{ event.address }}
发布会时间:{{ event.start_time }}
返回发布会列表{% endblock %}

  1. </code-block>
  2. <code-block title="events.html">
  3. ```html
  4. {% extends "sgin/base.html" %}
  5. {% block content %}
  6. <ul class="list-group">
  7. {% for event in event_list %}
  8. <li class="list-group-item text-center"><a href="/sgin/event_detail/{{ event.id }}">{{ event }}</a></li>
  9. {% endfor %}
  10. </ul>
  11. {% endblock %}
  1. {% extends "sgin/base.html" %}
  2. {% block content %}
  3. <div class = "panel panel-info">
  4. <div class="panel-heading">嘉宾详情页</div>
  5. <div class="panel-body">
  6. <p>姓名:{{ guest.name }}</p>
  7. <p>电话:{{ guest.phone }}</p>
  8. <p>邮箱:{{ guest.email }}</p>
  9. <p>发布会:{{ guest.event }}</p>
  10. </div>
  11. </div>
  12. <a href="/sgin/guests/" class="btn btn-info"> 返回嘉宾列表</a>
  13. {% endblock %}
  1. {% extends "sgin/base.html" %}
  2. {% block maintitle %} <h1>这里是嘉宾列表</h1> {% endblock %}
  3. {% block content %}
  4. <ul class="list-group">
  5. {% for guest in guest_list %}
  6. <li class="list-group-item text-center"><a href="/sgin/guest_detail/{{ guest.id }}">{{ guest }}</a></li>
  7. {% endfor %}
  8. </ul>
  9. {% endblock %}

py文件

  1. from django.contrib import admin
  2. from sgin import models
  3. # 后台管理关联数据模型
  4. admin.site.register(models.Event)
  5. admin.site.register(models.User)

发布会数据的字段名

class Event(models.Model):
name = models.CharField(‘发布会名称’, max_length=256)
address = models.CharField(‘发布会地点’, max_length=256)
limits = models.IntegerField(‘发布会人数’, default=100)
status = models.BooleanField(‘发布会状态’, default=True)
start_time = models.DateTimeField(“发布会开始时间”, null=True)

  1. # 以数据的名称显示
  2. def __str__(self):
  3. return self.name

参会人员的字段名

class User(models.Model):
# 关联发布会
event = models.ForeignKey(Event, on_delete=models.DO_NOTHING, verbose_name=”关联发布会”)
# 姓名和手机号唯一
name = models.CharField(‘姓名’, max_length=256, unique=True)
phone = models.CharField(‘手机号’, max_length=11, unique=True)
# 使用专属邮箱字段来管理邮箱地址
email = models.EmailField(‘邮箱’)

  1. join_time = models.DateTimeField(auto_now_add=True)
  2. def __str__(self):
  3. return self.name
  1. </code-block>
  2. <code-block title="urls.py">
  3. ```python
  4. from django.urls import path
  5. from sgin import views
  6. urlpatterns = [
  7. path('', views.events),
  8. # 发布会
  9. path('events/', views.events),
  10. path('event_detail/<int:event_id>', views.event_detail),
  11. # 嘉宾
  12. path('guests/', views.guests),
  13. path('guest_detail/<int:guest_id>', views.guest_details)
  14. ]
  1. from django.http import HttpResponse
  2. from django.shortcuts import render
  3. from sgin.templates import sgin
  4. from sgin.models import Event, User
  5. # 发布会列表视图
  6. def events(request):
  7. # 从数据库查询所有发布会信息
  8. event_list = Event.objects.all()
  9. return render(request, "sgin/events.html", {'event_list': event_list})
  10. # 发布会详情
  11. def event_detail(request, event_id):
  12. # 根据 event_id 查询对应的发布会数据
  13. # pk:主键 默认数据表中的主键名为id
  14. event = Event.objects.get(pk=event_id)
  15. return render(request, "sgin/event_detail.html", {"event": event})
  16. # 嘉宾列表视图
  17. def guests(request):
  18. guest_list = User.objects.all()
  19. return render(request, "sgin/guests.html", {"guest_list": guest_list})
  20. # 嘉宾详情页
  21. def guest_details(request, guest_id):
  22. guest = User.objects.get(id=guest_id)
  23. return render(request, "sgin/guest_detail.html", {"guest": guest})
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. from demo import urls as demo_url
  4. from sgin import urls as sgin_url
  5. urlpatterns = [
  6. path('admin/', admin.site.urls),
  7. path('demo/', include(demo_url)), # 以 demo 开头的路径,全部交给 demo app 处理
  8. path('sgin/', include(sgin_url)),
  9. path('', include(sgin_url)),
  10. ]

V2.0

需求:

  • 增加签到功能

发布会系统开发 - 图1