model表设计:

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here. class 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.caption class Book(models.Model):
user = models.ForeignKey(to="UserInfo",on_delete=models.CASCADE)
room = models.ForeignKey(to="Room",on_delete=models.CASCADE)
date = models.DateField()
time_choice = (
(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(time_choice) class Meta:
unique_together = (
("room","date","time_id"),
) def __str__(self):
return "{}预定了{}".format(self.user,self.room)

views视图函数:

from django.shortcuts import render,redirect,HttpResponse
from django.contrib import auth
from app01 import models
import datetime
import json
# Create your views here. def login(request):
if request.method == "POST": username = request.POST.get("username")
pwd = request.POST.get("password")
user = auth.authenticate(username=username,password=pwd)
if user:
auth.login(request,user)
return redirect("/index/") return render(request,"login.html",locals()) date = datetime.datetime.now().date() def index(request): if not request.user.is_authenticated:
return redirect("/login/") book_date = request.GET.get("book_date",date) time_choice=models.Book.time_choice
room_obj = models.Room.objects.all()
book_obj = models.Book.objects.filter(date=date) htmls = ""
for room in room_obj:
htmls += "<tr><td>{}</td>".format(room) for time in time_choice: is_choose = False for book in book_obj:
if book.time_id == time[0] and book.room_id == room.pk: #判断是否有人预订
is_choose = True
break if is_choose:
if request.user.pk == book.user_id:
htmls += "<td class='my_active item' time_id={} room_id={}>{}</td>".format(time[0],room.pk,book.user)
else:
htmls += "<td class='active item' time_id={} room_id={}>{}</td>".format(time[0],room.pk,book.user)
else:
htmls += "<td class='item' time_id={} room_id={}></td>".format(time[0],room.pk) htmls += "</tr>" return render(request,"index.html",locals()) def manage(request):
if request.method == "POST":
data = json.loads(request.POST.get("post_data"))
print(data) for room_id,time_id_list in data["del"].items():
for time_id in time_id_list:
models.Book.objects.filter(user_id=request.user.pk,room_id=room_id,time_id=time_id,date=date).delete() for room_id,time_id_list in data["add"].items():
for time_id in time_id_list:
models.Book.objects.create(user_id=request.user.pk,room_id=room_id,time_id=time_id,date=date) return HttpResponse(json.dumps("ok"))

templates模板部分:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<style>
.my_active{background-color: red}
.active{background-color: silver}
.temp_active{background-color: #2aabd2}
</style>
</head>
<body> <h1>会议室预订</h1> <table class="table table-bordered">
<tr>
<th>会议室/时间</th>
{% for time in time_choice %}
<th>{{ time.1 }}</th>
{% endfor %}
</tr>
{{ htmls|safe }}
</table>
<button>保存</button>
{% csrf_token %} <script src="/static/jquery.js"></script>
<script src="/static/bootstrap/js/bootstrap.js"></script>
<script> var post_data = {"add":{},"del":{}}; //为td标签绑定点击事件
$(".item").click(function(){ var time_id = $(this).attr("time_id");
var room_id = $(this).attr("room_id"); if($(this).hasClass("my_active")){ //如果是登录人预订的时间
$(this).removeClass("my_active");
$(this).text(""); if(post_data["del"][room_id]){
post_data["del"][room_id].push(time_id)
}else{
post_data["del"][room_id] = [time_id,];
} }else if($(this).hasClass("active")){ //如果是别人预订的时间
alert("已经被预订!") }else if($(this).hasClass("temp_active")){
$(this).removeClass("temp_active")
$(this).text("")
post_data["add"][room_id].splice(jQuery.inArray(time_id,post_data["add"][room_id]),1) }else{ //如果没人预订
$(this).addClass("temp_active");
$(this).text("{{ request.user.username }}") if(post_data["add"][room_id]){
post_data["add"][room_id].push(time_id)
}else{
post_data["add"][room_id] = [time_id,];
}
}
console.log(post_data)
}) var csrf = $("[name='csrfmiddlewaretoken']").val() $("button").click(function(){
$.ajax({
url:"/manage/",
type:"post",
data:{
post_data:JSON.stringify(post_data),
csrfmiddlewaretoken:csrf,
},
dataType:"json",
success:function(arg){
console.log(arg)
location.href = "" }
})
})
</script>
</body>
</html>

Django之会议室预预订的更多相关文章

  1. 基于django的会议室预订系统

    会议室预订系统 一.目标及业务流程 期望效果: 业务流程: 用户注册 用户登录 预订会议室 退订会议室 选择日期:今日以及以后日期 二.表结构设计和生成 1.models.py(用户继承Abstrac ...

  2. django 简单会议室预约(5)

    再来看看views.py的后半部分,对数据库的增删改查 #获取学院列表 def get_acad_list(): room_list = ConfeRoom.objects.all() #对数据库的操 ...

  3. django 简单会议室预约(6)

    后台完了现在来看前端,前端用了一个bootstrap框架,看起来能好看点 先看一下文件结构:在djapp里创建了两个文件夹templates和static templates里面是要显示的页面,sta ...

  4. django 简单会议室预约(2)

    --我们先打开settings.py 配置文件: import os #指明django APP目录路径 BASE_DIR = os.path.dirname(os.path.dirname(os.p ...

  5. django 简单会议室预约(4)

    基本的配置已经完成了,来看看最重要的views.py 先看看简单的注册登录功能,在django里有一个专门的模块用来验证用户信息 :所以只需要调用就好了: #-*-coding:utf-8 -*- f ...

  6. django 简单会议室预约(3)

    URL配置: 今天配置一下URL,打开urls.py配置如下: from django.conf.urls import patterns, include, url from djapp impor ...

  7. django 简单会议室预约(1)

    django 是python的一个web框架,为什么要用django,作者之前用过另一个框架flask,虽然flask比较简单很容易让人学,但是flask没有整体感,会让初学着茫然. 这里我们用dja ...

  8. python的web框架---Django项目

    Django项目之会议室预预订: 界面效果展示: 1.创建超级管理员,实现预定界面功能 2.预定界面: (一)基于pymysql设计数据表结构,理清前后端与用户交互逻辑.(用户表,会议室表,预定内容存 ...

  9. 【Django】模型层说明

    [Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...

随机推荐

  1. python基础语法、数据结构、字符编码、文件处理 练习题

    考试范围 '''1.python入门:编程语言相关概念2.python基础语法:变量.运算符.流程控制3.数据结构:数字.字符串.列表.元组.字典.集合4.字符编码5.文件处理''' 考试内容 1.简 ...

  2. Visual Studio中Image Watch的使用

    Imag watch的简介 Image Watch是一个VS插件,能够让你在调试一个OpenCV程序的时候,看到内存中的图像,这对跟踪bug或者理解一段代码非常有帮助.(原文:Image Watch ...

  3. firewall centos

    firewall-cmd --add-port=8056/tcp    --临时增加端口 firewall-cmd --permanent --zone=public --add-port=6069/ ...

  4. .Net Core应用框架Util介绍(五)

    上篇简要介绍了Util在Angular Ts方面的封装情况,本文介绍Angular封装的另一个部分,即Html的封装. 标准组件与业务组件 对于管理后台这样的表单系统,你通常会使用Angular Ma ...

  5. 一篇博客带你入门Flask

    一. Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不 ...

  6. PHP artisan migrate 报错显示 could not find driver ,怎么办?

    记录下自己的错误 一. 1.原因是没有pdo扩展导致的, 2.解决办法:打开php.ini,然后去掉以下两行代码之前的分号(:)即可.如下: extension=php_pdo_firebird.dl ...

  7. Linux(Ubuntu)使用日记(三)------git安装使用

    1. 安装 首先,确认你的系统是否已安装git,可以通过git指令进行查看,如果没有,在命令行模式下输入sudo apt-get install git命令进行安装. 2.  配置 git confi ...

  8. Java并发编程:volatile关键字解析(转载)

    转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析   Java并发编程:volatile关键字解析 ...

  9. Linux 学习 (四) 帮助命令

    Linux达人养成计划 I 学习笔记 man 命令 获取指定命令的帮助 man的级别 1:查看命令的帮助 2:查看可被内核调用的函数的帮助 3:查看函数和函数库的帮助 4:查看特殊文件的帮助(主要是/ ...

  10. mybatis操作mysql的奇淫技巧总结(代码库)

    1.添加公共sql代码段 使用<sql> 和 <include> 标签 <sql id="userSubassemblyRecordParam"> ...