本文共 13749 字,大约阅读时间需要 45 分钟。
简单的车票预订系统,采用django2.0搭建。
简单的购票界面,使用html、css和bootstrap搭建。所有操作都在“一个”页面内完成,通过此页面可以进行预订车票、查询所购买的车票以及取消预订的车票。
使用的数据库为mysql。
"""订票系统-数据库类型定义部分使用数据库 mysql--------------------------------定义数据类型:1、订票类型 2、会员类型"""from django.db import modelsfrom datetime import datetimeclass Tickets(models.Model): name = models.CharField(max_length=30, verbose_name=u"车票名称") num = models.CharField(default='K100', max_length=10, verbose_name=u"车票编号") time = models.DateTimeField(verbose_name=u"车票出发时间") brief = models.TextField(max_length=300, verbose_name=u"车票信息") seats = models.IntegerField(default=0, verbose_name=u"剩余座位") def __str__(self): return self.name class Meta: verbose_name = "车票信息" verbose_name_plural = verbose_nameclass Person(models.Model): name = models.CharField(max_length=10, verbose_name=u"乘客名称") phone_number = models.CharField(max_length=11, verbose_name=u"电话号码") ticket_name = models.CharField(default=' ', max_length=30, verbose_name=u"购买车票名称") # 实际存储为车次,非车票名称 ticket_time = models.DateTimeField(default=datetime.now(), verbose_name=u"购买车票时间") def __str__(self): return self.name class Meta: verbose_name = "乘客信息" verbose_name_plural = verbose_name
分别对应页面中两个输入表单。
"""订票系统-表单处理部分--------------------------------"""from django import formsfrom .models import Person# 预订车票填写信息Formclass TicketForm(forms.Form): name = forms.CharField(label='name', max_length=10, error_messages={ 'required': '请填写您的姓名', 'max_length': '名字太长了'}) phone_number = forms.CharField(label='phone_number', min_length=11, max_length=11, error_messages={ 'required': '手机号码输入不正确', 'min_length': '您输入的号码数不符合11位', 'max_length': '您输入的号码数不符合11位'}) ticket_num = forms.CharField(label='ticket_num', max_length=10, error_messages={ 'required': '车票编号输入不正确'}) # 因为预订车票车次已经足够,车票时间有些多余,所以删掉 # ticket_time = forms.DateTimeField(label='ticket_time', error_messages={'required': '车票时间输入不正确'})# 查询信息填写Formclass PersonForm(forms.Form): name = forms.CharField(label='name', max_length=10, error_messages={ 'required': '请填写您的姓名', 'max_length': '名字太长了'}) phone_number = forms.CharField(label='phone_number', min_length=11, max_length=11, error_messages={ 'required': '请输入手机号码', 'min_length': '您输入的号码数不符合11位', 'max_length': '您输入的号码数不符合11位'})
需要注意此view在一个静态页面中进行操作,同一个页面中有三个表单。
"""订票系统-视图逻辑定义部分分别包括:信息显示view、预订车票view以及查询取消view--------------------------------"""from django.shortcuts import render, redirectfrom apps.order.models import Person, Ticketsfrom django.views import Viewfrom .forms import TicketForm, PersonFormfrom django.http import HttpResponseRedirectfrom django.urls import reversefrom datetime import datetime# 首页显示信息view,将所有的信息传递给主页并进行显示def detailview(request): # 获取数据库中所有的信息 tickets = Tickets.objects.all() persons = Person.objects.all() ticket_form = TicketForm() person_form = PersonForm() # 打包为dic content = { 'tickets': tickets, 'persons': persons, 'ticket_form': ticket_form, 'person_form': person_form, } return render(request, 'order_system.html', context=content)# 预订车票功能viewdef orderview(request): # 页面中有信息传递进来,此时method==POST if request.method == 'POST': # 将获取的信息进行Form处理 ticket_form = TicketForm(request.POST) tickets = Tickets.objects.all() persons = Person.objects.all() person_form = PersonForm() content = { 'tickets': tickets, 'persons': persons, 'ticket_form': ticket_form, 'person_form': person_form, 'order_message': '' } # 判断post过来的信息是否正确 if ticket_form.is_valid(): ticket = Tickets.objects.get(num=request.POST['ticket_num']) # 判断数据库中保存的购票记录中是否存在此人,如果存在则取出该数据赋给person,不存在则新建一个person person = Person.objects.create() if not Person.objects.filter(name=request.POST['name']) \ else Person.objects.get(name=request.POST['name']) # 判断购票时间是否正确 now_time = datetime.now() time_day = now_time.day - ticket.time.day if person.ticket_name == ticket.num: message = '您已购买过此车票!' else: if time_day > 1: message = '只能购买今天和明天的车票!' else: if time_day == 0 and now_time.hour >= 23: message = '当天车票超过晚上11点不可以进行购买' else: if ticket.seats >= 1: message = '预订成功!' ticket.seats -= 1 ticket.save() person.name = request.POST['name'] person.phone_number = request.POST['phone_number'] person.ticket_time = ticket.time person.ticket_name = request.POST['ticket_num'] person.save() else: message = '该车次暂无座位!' person.delete() content['order_message'] = message return render(request, 'order_system.html', context=content) else: return HttpResponseRedirect(reverse(detailview))# 查询订单、删除订单操作view# 此view与之前的view不同,为class view# 使用class view中的类变量进行表单间信息的传递class QueryView(View): # 此处定义一个类变量,类变量的内存只存在一份,在所有类实例中会共享此参数 temp = None def get(self,request): # get操作返回主页即可 return HttpResponseRedirect(reverse(detailview)) def post(self,request): if request.POST.get('submit') == 'find': person_form = PersonForm(request.POST) ticket_form = TicketForm() tickets = Tickets.objects.all() persons = Person.objects.all() content = { 'tickets': tickets, 'persons': persons, 'ticket_form': ticket_form, 'person_form': person_form, 'query_message': '', 'show': 0, } if person_form.is_valid(): if Person.objects.filter(name=request.POST['name']): # 根据传递来的post信息,过滤获得此person persons = Person.objects.filter(name=request.POST['name']) content['show'] = 1 # flag,若为1则在页面中显示已经查询到的信息 content['persons'] = persons content['query_message'] = '查询成功!' # 将查询信息保存到类变量中 QueryView.temp = request.POST['name'] return render(request, 'order_system.html', context=content) else: content['query_message'] = '用户信息不存在!' return render(request, 'order_system.html', context=content) return render(request, 'order_system.html', context=content) else: if request.POST.get('submit') == 'yes': # 从类变量中获取到之前传过来的查询到用户的信息 persons = Person.objects.get(name=QueryView.temp) person_form = PersonForm() ticket_form = TicketForm() tickets = Tickets.objects.all() message = '用户订单取消成功!' content = { 'tickets': tickets, 'persons': persons, 'ticket_form': ticket_form, 'person_form': person_form, 'cansel_message': message, } # 取消订单后 ticket = Tickets.objects.get(num=persons.ticket_name) ticket.seats += 1 # 座位归还 ticket.save() persons.delete() # 删除此人购买信息 return render(request, 'order_system.html', context=content) else: return HttpResponseRedirect(reverse(detailview))
from django.contrib import adminfrom django.urls import pathfrom apps.order import viewsfrom apps.order.views import QueryViewurlpatterns = [ path('admin/', admin.site.urls), path('', views.detailview, name='home'), # 主页url path('order/', views.orderview, name='order'), # 预订url path('query/', QueryView.as_view(), name='query'), # 查询取消订单url # path('unsubscribe/(?P\w+)/$', views.unsubview, name='unsubscribe')]
订票页面 车票预订系统
这是一个简易的车票预订系统,制作者:OLDPAN
当前车票信息
{% for ticket in tickets %} 车票编号 车票名称 开车时间 剩余座位 {% endfor %} { { ticket.num }} { { ticket.name }} { { ticket.time|date:"Y-m-d H:i" }} { { ticket.seats }} 输入购票信息开始购票
预订信息查询
查询结果在下方列表栏中
{% if show %} {% endif %}
{% if show %} {% for person in persons %} 乘客姓名 电话号码 车次 开车时间 {% empty %} { { person.name }} { { person.phone_number }} { { person.ticket_name }} { { person.ticket_time|date:"Y-m-d H:i" }} {% endfor %} {% endif %} 暂无乘车人 None None None
购票预订成功
购票信息查询
点击确定取消取消用户订单
此刻再进行查询查询不到
购买车票日期不对对进行提醒(此时系统时间12-16)
表单中输入信息不正确是进行提示。
做这个小系统花了差不多两天的功夫,之前使用django搭过博客,这次做这个小东西,回顾之余也遇到了几个小问题,如何在同一个页面中进行不同表单间信息的传递?如果判断同一个页面中不同表单的执行动作?花费了一些功夫终于弄了出来。希望对大家有帮助。
源代码被我上传到了github,有兴趣参考的可以看看: