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项目篇-酒店(会议室,电影)预定相关推荐

  1. python会议室系统预定_python项目篇-酒店(会议室,电影)预定

    1.views.py中 from django.shortcuts import render,redirect,HttpResponse # Create your views here. from ...

  2. Python基于Django酒店宾馆客房预定网站设计

    技术环境: PyCharm + Django2.2 + Python3.7 + mysql (1)登陆:用户可以通过用户名和密码进行登陆系统. (2)修改密码:用户可以通过对在个人资料模块进行修改密码 ...

  3. 电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分

    电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分,是电影天堂APP项目开发课程的第一篇章,讲解使用requests和bs4库,爬取和解析电影天堂网站数据,并讲数据保存到SQLite数 ...

  4. Python+Django+Mysql实现在线电影推荐系统 基于用户、项目的协同过滤推荐在线电影系统 代码实现 源代码下载

    Python+Django+Mysql实现在线电影推荐系统(基于用户.项目的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 pycharm2020professional版本,python3 ...

  5. python将姓王的都改成老王_老王Python基础+进阶+项目篇(高清无密)

    老王Python教程 基础篇 基础篇1-福利课python先入为主上 基础篇2-福利课-python先入为主下篇 基础篇3-虚拟机安装xubuntu开发环境 基础篇4-linux基本命令以及开发环境 ...

  6. python实战项目书 题库系统_Python实战视频教程_基于Python项目与面试题实例讲解(进阶训练篇)...

    课程介绍: 精选50个Python项目实战与面试容易遇到的问题作为训练任务,每个任务都先提出问题,分析问题.然后给出巧妙与高效的解决办法,最后手把手代码实战完成任务,带你全面提升python项目实战核 ...

  7. 2013流行Python项目汇总

    2013流行Python项目汇总 转自:http://www.kankanews.com/ICkengine/archives/102963.shtml Python作为程序员的宠儿,越来越得到人们的 ...

  8. 对比了 18000 个 Python 项目,这 TOP45 值得学习!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 图片来源:edureka.co 翻译 | 林椿眄 编辑 | Donna 出品 | 人工智能头 ...

  9. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

最新文章

  1. 国内网络环境优化qiime2安装过程-QIIME 2安装慢或无法下载的解决方案
  2. Masking GAN pytorch
  3. python数据插值_【Python】【数据分析】缺失值处理——插值
  4. asp.net 程序,当发生找不到文件的错误时,如何正确定位是哪个文件?
  5. 电音之王 对64bit int 取模
  6. spring 调用python_Spring http服务远程调用实现过程解析
  7. POJ 1091(数论)
  8. 李学勤:功利化是现在教育的最大问题
  9. 修改折半查找算法进行范围查找
  10. Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同
  11. web移动开发总结(一)
  12. 只能用GUEST用户访问共享的解决办法
  13. Linux网络编程(四)
  14. 《预训练周刊》第24期:Infinite-former:无限记忆变换器、2500万悟道科研基金开始申请...
  15. Qt之实现图片轮播效果
  16. 浅析故障电弧探测器在电气防火中的作用与应用介绍
  17. 公众号开发完整页面1
  18. rsa前后端加密流程_HTTPS 温故知新(三)——直观感受 TLS 握手流程(中)
  19. 一站式移动办公SaaS将成为未来企业管理平台的最佳选择
  20. 软件测试知识点汇总(NK)(更新至2021.12.08)

热门文章

  1. Evosuite用maven构建(内附详细过程)
  2. 生鲜配送app哪些功能需要开发
  3. 简述拥塞控制的四种基本算法
  4. HRNet 源码分析
  5. 每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推
  6. 准确率、精确率、召回率、F1值学习笔记
  7. 使用PHP TP5 框架 发送邮箱
  8. Android APP安装后在桌面上不显示应用图标
  9. 算法训练营 训练 硬木种类、双重队列、水果(关联容器map)
  10. css实现折叠样式实现