python项目篇-酒店(会议室,电影)预定
1、views.py中
from django.shortcuts import render,redirect,HttpResponse# Create your views here.from django.contrib import authdef login(request):if request.method=="POST":user=request.POST.get("user")pwd=request.POST.get("pwd")user=auth.authenticate(username=user,password=pwd)if user:auth.login(request,user) # request.userreturn redirect("/index/")return render(request,"login.html")from .models import *
import datetime
def index(request):date=datetime.datetime.now().date()book_date=request.GET.get("book_date",date)print("book_date",book_date)time_choices=Book.time_choicesroom_list=Room.objects.all()book_list=Book.objects.filter(date=book_date)print("time_choices",time_choices)htmls=""for room in room_list:htmls+="<tr><td>{}({})</td>".format(room.caption,room.num)for time_choice in time_choices:book=Noneflag=Falsefor book in book_list:if book.room.pk==room.pk and book.time_id==time_choice[0]:#意味这个单元格已被预定flag=Truebreakif flag:if request.user.pk==book.user.pk:htmls += "<td class='active item' room_id={} time_id={}>{}</td>".format(room.pk, time_choice[0],book.user.username)else:htmls += "<td class='another_active item' room_id={} time_id={}>{}</td>".format(room.pk, time_choice[0],book.user.username)else:htmls+="<td room_id={} time_id={} class='item'></td>".format(room.pk,time_choice[0])htmls+="</tr>"# print(htmls)return render(request,"index.html",locals())import jsondef book(request):# print("request.POST",request.POST)post_data=json.loads(request.POST.get("post_data")) # {"ADD":{"1":["5"],"2":["5","6"]},"DEL":{"3":["9","10"]}}# print("post_data", post_data)choose_date=request.POST.get("choose_date")res={"state":True,"msg":None}try:# 添加预定#post_data["ADD"] : {"1":["5"],"2":["5","6"]}book_list=[]for room_id,time_id_list in post_data["ADD"].items():for time_id in time_id_list:book_obj=Book(user=request.user,room_id=room_id,time_id=time_id,date=choose_date)book_list.append(book_obj)Book.objects.bulk_create(book_list)# 删除预定from django.db.models import Q# post_data["DEL"]: {"2":["2","3"]}# print("post_data['DEL']:", post_data["DEL"].items())remove_book = Q()for room_id,time_id_list in post_data["DEL"].items():temp = Q()for time_id in time_id_list:temp.children.append(("room_id",room_id))temp.children.append(("time_id",time_id))temp.children.append(("user_id",request.user.pk))temp.children.append(("date",choose_date))remove_book.add(temp,"OR")if remove_book:Book.objects.filter(remove_book).delete()except Exception as e:res["state"]=Falseres["msg"]=str(e)return HttpResponse(json.dumps(res))
2、HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Index</title><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"><script src="/static/js/jquery-1.12.4.min.js"></script><script src="/static/datetimepicker/bootstrap-datetimepicker.min.js"></script><script src="/static/datetimepicker//bootstrap-datetimepicker.zh-CN.js"></script><style>.active{background-color: green!important;color: white;}.another_active{background-color: #2b669a;color: white;}.td_active{background-color: lightblue;color: white;}</style>
</head>
<body>
<h3>酒店房间预定</h3><div class="calender pull-right"><div class='input-group' style="width: 230px;"><input type='text' class="form-control" id='datetimepicker11' placeholder="请选择日期"/><span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span></div>
</div><table class="table table-bordered table-striped"><thead><tr><th>房间/时间</th>{% for time_choice in time_choices %}<th>{{ time_choice.1 }}</th>{% endfor %}</tr></thead><tbody>{{ htmls|safe }}
</tbody></table>
<button class="btn btn-success pull-right keep">保存</button><script>// 日期格式化方法Date.prototype.yuan = function (fmt) { //author: meizzvar o = {"M+": this.getMonth() + 1, //月份"d+": this.getDate(), //日"h+": this.getHours(), //小时"m+": this.getMinutes(), //分"s+": this.getSeconds(), //秒"q+": Math.floor((this.getMonth() + 3) / 3), //季度"S": this.getMilliseconds() //毫秒};if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));for (var k in o)if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));return fmt;};var POST_DATA={"ADD":{},"DEL":{},};// 为td绑定单击事件function BindTd() {$(".item").click(function () {var room_id=$(this).attr("room_id");var time_id=$(this).attr("time_id");// 取消预定if($(this).hasClass("active")){$(this).removeClass("active").empty();if(POST_DATA.DEL[room_id]){POST_DATA.DEL[room_id].push(time_id)}else {POST_DATA.DEL[room_id]=[time_id,]console.log(POST_DATA.DEL[room_id]=[time_id,])}}// 临时取消预定else if ($(this).hasClass("td_active")){$(this).removeClass("td_active");POST_DATA.ADD[room_id].pop()}else{ // 添加预定$(this).addClass("td_active");if(POST_DATA.ADD[room_id]){POST_DATA.ADD[room_id].push(time_id)}else {POST_DATA.ADD[room_id]=[time_id,]}}})}BindTd();// 日期if (location.search.slice(11)){CHOOSE_DATE = location.search.slice(11)}else {CHOOSE_DATE = new Date().yuan('yyyy-MM-dd');}// 发送ajax$(".keep").click(function() {$.ajax({url:"/book/",type:"POST",data:{choose_date:CHOOSE_DATE,post_data:JSON.stringify(POST_DATA),},dataType:"json",success:function (data) {console.log(data)if(data.state){// 预定成功location.href=""}else {alert("预定的房间已经被预定")location.href=""}}})});// 日历插件$('#datetimepicker11').datetimepicker({minView: "month",language: "zh-CN",sideBySide: true,format: 'yyyy-mm-dd',startDate: new Date(),bootcssVer: 3,autoclose: true,}).on('changeDate', book_query);function book_query(e) {CHOOSE_DATE=e.date.yuan("yyyy-MM-dd");location.href="/index/?book_date="+CHOOSE_DATE;}
</script></body>
</html>
3、model.py中
from django.db import models# Create your models here.
from django.db import models
from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):tel=models.CharField(max_length=32)class Room(models.Model):"""会议室表"""caption = models.CharField(max_length=32)num = models.IntegerField() # 容纳人数def __str__(self):return self.captionclass Book(models.Model):"""会议室预定信息"""user = models.ForeignKey('UserInfo',on_delete=models.CASCADE)room = models.ForeignKey('Room',on_delete=models.CASCADE)date = models.DateField()time_choices = ((1, '8:00'),(2, '9:00'),(3, '10:00'),(4, '11:00'),(5, '12:00'),(6, '13:00'),(7, '14:00'),(8, '15:00'),(9, '16:00'),(10, '17:00'),(11, '18:00'),(12, '19:00'),(13, '20:00'),)time_id = models.IntegerField(choices=time_choices)class Meta:unique_together = (('room','date','time_id'),)def __str__(self):return str(self.user)+"预定了"+str(self.room)
里面用到一个日历插件datetimepicker
效果图
python项目篇-酒店(会议室,电影)预定相关推荐
- python会议室系统预定_python项目篇-酒店(会议室,电影)预定
1.views.py中 from django.shortcuts import render,redirect,HttpResponse # Create your views here. from ...
- Python基于Django酒店宾馆客房预定网站设计
技术环境: PyCharm + Django2.2 + Python3.7 + mysql (1)登陆:用户可以通过用户名和密码进行登陆系统. (2)修改密码:用户可以通过对在个人资料模块进行修改密码 ...
- 电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分
电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分,是电影天堂APP项目开发课程的第一篇章,讲解使用requests和bs4库,爬取和解析电影天堂网站数据,并讲数据保存到SQLite数 ...
- Python+Django+Mysql实现在线电影推荐系统 基于用户、项目的协同过滤推荐在线电影系统 代码实现 源代码下载
Python+Django+Mysql实现在线电影推荐系统(基于用户.项目的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 pycharm2020professional版本,python3 ...
- python将姓王的都改成老王_老王Python基础+进阶+项目篇(高清无密)
老王Python教程 基础篇 基础篇1-福利课python先入为主上 基础篇2-福利课-python先入为主下篇 基础篇3-虚拟机安装xubuntu开发环境 基础篇4-linux基本命令以及开发环境 ...
- python实战项目书 题库系统_Python实战视频教程_基于Python项目与面试题实例讲解(进阶训练篇)...
课程介绍: 精选50个Python项目实战与面试容易遇到的问题作为训练任务,每个任务都先提出问题,分析问题.然后给出巧妙与高效的解决办法,最后手把手代码实战完成任务,带你全面提升python项目实战核 ...
- 2013流行Python项目汇总
2013流行Python项目汇总 转自:http://www.kankanews.com/ICkengine/archives/102963.shtml Python作为程序员的宠儿,越来越得到人们的 ...
- 对比了 18000 个 Python 项目,这 TOP45 值得学习!
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 图片来源:edureka.co 翻译 | 林椿眄 编辑 | Donna 出品 | 人工智能头 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
最新文章
- 国内网络环境优化qiime2安装过程-QIIME 2安装慢或无法下载的解决方案
- Masking GAN pytorch
- python数据插值_【Python】【数据分析】缺失值处理——插值
- asp.net 程序,当发生找不到文件的错误时,如何正确定位是哪个文件?
- 电音之王 对64bit int 取模
- spring 调用python_Spring http服务远程调用实现过程解析
- POJ 1091(数论)
- 李学勤:功利化是现在教育的最大问题
- 修改折半查找算法进行范围查找
- Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同
- web移动开发总结(一)
- 只能用GUEST用户访问共享的解决办法
- Linux网络编程(四)
- 《预训练周刊》第24期:Infinite-former:无限记忆变换器、2500万悟道科研基金开始申请...
- Qt之实现图片轮播效果
- 浅析故障电弧探测器在电气防火中的作用与应用介绍
- 公众号开发完整页面1
- rsa前后端加密流程_HTTPS 温故知新(三)——直观感受 TLS 握手流程(中)
- 一站式移动办公SaaS将成为未来企业管理平台的最佳选择
- 软件测试知识点汇总(NK)(更新至2021.12.08)