详解python Todo清单实战


Posted in Python onNovember 01, 2018

Todo清单

需要实现的功能有添加任务、删除任务、编辑任务,操作要关联数据库。

任务需要绑定用户,部门。用户需要绑定部门。

{#自己编写一个基类模板#}
{% extends 'bootstrap/base.html' %}

{% block styles %}
{{ super() }}
  <link rel="stylesheet" href="../static/css/main.css" rel="external nofollow" >
{% endblock %}
{% block navbar %}
<nav class="navbar navbar-default">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
          data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="index.html" rel="external nofollow" ></a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页<span class="sr-only">(current)</span></a></li>
        <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新闻</a></li>
        <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >国际</a></li>
        <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >国内</a></li>
        <li><a href="/sysinfo/" rel="external nofollow" >系统信息</a></li>
        <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >登陆用户</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">


        {% if 'user' in session %}
        <li><a href="login.html" rel="external nofollow" ><span class="glyphicon glyphicon-user"></span>
             {{ session.user }}</a></li>
        <li><a href="/logout/" rel="external nofollow" ><span class="glyphicon glyphicon-log-in"></span>
             注销 </a></li>


        {% else %}

        <li><a href="/login/" rel="external nofollow" ><span class="glyphicon glyphicon-log-in"></span>
            登陆</a></li>
        {% endif %}


        <li><a href="/register/" rel="external nofollow" ><span class="glyphicon glyphicon-log-out"></span>
            注册</a></li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>
{% endblock %}

{% block content %}
{#定义属于自己的block#}
  {% block newcontent %}


  {% endblock %}

  {% block footer %}
<div class="footer" style="margin: 0 auto">

    宇宙大魔王

</div>
{% endblock %}
{% endblock %}
{#列表清单#}
{% extends 'base.html' %}

{% block newcontent %}
  <div class="row">
    <div class="col-md-6 col-md-offset-3">
      /*添加任务*/
      <form class="form-horizontal" action="/todo/add/" method="post">
        <div class="form-group">
          {# 添加框          #}
          <div class="col-sm-9">
            <input type="text" class="form-control" placeholder="请添加任务" required="required"
                name="todo_name">
          </div>
          {#  选择框       #}
          <div class="col-sm-2">
            <select class="form-control" name="part">
              {% for part in parts %}
                <option value="{{ part.id }}">{{ part.name }}</option>
              {% endfor %}
            </select>
          </div>

          {#  添加的按钮       #}
          <div class="col-sm-1">
            <input type="submit" class="btn btn-success" value="添加任务">
          </div>
        </div>

      </form>


      /*任务显示*/
      <h1>添加任务</h1>
      <table class="table table-bordered">
        <tr>
          <td>任务内容</td>
          <td>创建时间</td>
          <td>状态</td>
          <td>所属部门</td>
          <td>操作</td>
        </tr>
        {% for todo in todos %}
          <tr>
            <td>{{ todo.name }}</td>
            <td>{{ todo.add_time }}</td>
            {#    #}
            <td>
              {% if todo.status %}
                 <a href="/todo/undo/{{ todo.id }}/" rel="external nofollow" class="btn btn-sm btn-success" role="button"><span
              class="glyphicon glyphicon-remove"></span> 已完成</a>

              {% else %}
                <a href="/todo/done/{{ todo.id }}/" rel="external nofollow" class="btn btn-sm btn-warning" role="button"><span
              class="glyphicon glyphicon-remove"></span> 未完成</a>

              {% endif %}

            </td>
            <td>{{ todo.depart.name }}</td>
            <td>
{#              <a href="/todo/delete/{{ todo.id }}/" rel="external nofollow" rel="external nofollow" role="button">删除</a>#}
{#              <a href="/todo/delete/{{ todo.id }}/" rel="external nofollow" rel="external nofollow" class="btn btn-primary btn-lg active" role="button">删除</a>#}
                <a href="/todo/delete/{{ todo.id }}/" rel="external nofollow" class="btn btn-danger" role="button"><span
              class="glyphicon glyphicon-remove"></span> 删除</a>
            </td>
          </tr>

        {% endfor %}


      </table>
    </div>
  </div>

{% endblock %}
# 数据库操作文件 todo_models.py
from datetime import datetime
import pymysql
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/todo'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
bootstrap = Bootstrap(app)

class User(db.Model):
  id = db.Column(db.INTEGER,autoincrement=True,primary_key=True)
  name = db.Column(db.String(30),unique=True)
  pwd = db.Column(db.String(30))
  add_time = db.Column(db.DateTime, default=datetime.now())
  phone = db.Column(db.String(11))
  email = db.Column(db.String(18),unique=True)
  info = db.Column(db.TEXT)
  department_id = db.Column(db.INTEGER,db.ForeignKey('department.id'))  #部门id与其他表关联
  todo_id = db.relationship('Todo',backref = 'user')
  def __repr__(self):
    return '<User:%s>' %(self.name)
class Department(db.Model):
  id = db.Column(db.INTEGER,autoincrement=True,primary_key=True)
  name = db.Column(db.String(30),unique=True)
  users = db.relationship('User',backref = 'depart')
  todos = db.relationship('Todo',backref = 'depart')
  def __repr__(self):
    return '<Depart:%s>' %(self.name)

class Todo(db.Model):
  id = db.Column(db.INTEGER,autoincrement=True,primary_key=True)
  name = db.Column(db.String(30))
  add_time = db.Column(db.DateTime, default=datetime.now())
  status = db.Column(db.Boolean, default=False)
  department_id = db.Column(db.INTEGER,db.ForeignKey('department.id'))  #部门id与其他表关联
  user_id = db.Column(db.INTEGER,db.ForeignKey('user.id'))
  def __repr__(self):
    return '<Todo:%s>' % (self.name)
if __name__ == '__main__':
  db.drop_all()
  db.create_all()
  parts = ['人事部','Python开发部','Java开发部']
  partObj = [Department(name=part) for part in parts]
  db.session.add_all(partObj)
  db.session.commit()

  user_1 = User(name='sheen',pwd='123',department_id=2)
  db.session.add(user_1)
  db.session.commit()
# 试图函数程序 todo_views.py
from flask import render_template, url_for, request, redirect
from todo_models import app,Todo,Department,db

@app.route('/')
def index():
  return render_template('base.html')

@app.route('/login/')
def login():
  return render_template('todo_login.html')
@app.route('/list/')
def todo_list():
  todos = Todo.query.all()
  parts = Department.query.all()
  return render_template('todo_list.html',todos=todos,parts=parts)
@app.route('/todo/add/',methods=['POST'])
def add():
  name = request.form['todo_name']  #在todo_list.html文件中表单定义的添加任务input属性name="todo_name"。
  part = request.form['part']
  todo = Todo(name=name,department_id=part,user_id=1)
  db.session.add(todo)
  db.session.commit()
  print('ok')
  return redirect(url_for('todo_list'))
@app.route('/todo/undo/<int:id>/')
def undo(id):
  todo = Todo.query.filter_by(id=id).first()
  todo.status = False
  db.session.commit()
  return redirect(url_for('todo_list'))

@app.route('/todo/done/<int:id>/')
def done(id):
  todo = Todo.query.filter_by(id=id).first()
  todo.status = True
  db.session.commit()
  return redirect(url_for('todo_list'))

@app.route('/todo/delete/<int:id>/')
def todo_del(id):
  todo = Todo.query.filter_by(id=id).first()
  db.session.delete(todo)
  db.session.commit()
  return redirect(url_for('todo_list'))
# 主程序 run.py
from flask import Flask
from todo_models import app
from todo_views import *

if __name__ == '__main__':
  app.run()

list 页面最初显示图

详解python Todo清单实战

当添加任务后,页面显示如下

详解python Todo清单实战

当鼠标点击任务状态时,会发生改变

详解python Todo清单实战

当点击删除按钮时,任务从数据库中删除,也不在页面中显示

详解python Todo清单实战

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python提取html文件中的特定数据的实现代码
Mar 24 Python
python list转dict示例分享
Jan 28 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
window下eclipse安装python插件教程
Apr 24 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
python导入模块交叉引用的方法
Jan 19 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
如何使用python实现模拟鼠标点击
Jan 06 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
使用tkinter实现三子棋游戏
Feb 25 Python
python脚本框架webpy的url映射详解
Nov 20 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 #Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 #Python
使用python获取电脑的磁盘信息方法
Nov 01 #Python
在IPython中执行Python程序文件的示例
Nov 01 #Python
在IPython中进行Python程序执行时间的测量方法
Nov 01 #Python
Python找出微信上删除你好友的人脚本写法
Nov 01 #Python
[原创]Python入门教程4. 元组基本操作
Oct 31 #Python
You might like
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
Python中的Descriptor描述符学习教程
2016/06/02 Python
Python实现针对中文排序的方法
2017/05/09 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python中kmeans聚类实现代码
2018/02/23 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
英国香水店:The Perfume Shop
2017/03/27 全球购物
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
庆七一活动方案
2014/01/25 职场文书
员工拓展培训方案
2014/02/15 职场文书
学生生病请假条范文
2014/02/16 职场文书
干部个人对照检查材料
2014/08/25 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL