详解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函数编程的一些特性
Apr 13 Python
在Python中操作字典之setdefault()方法的使用
May 21 Python
Python编程实现的图片识别功能示例
Aug 03 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
python+os根据文件名自动生成文本
Mar 21 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
python中的Elasticsearch操作汇总
Oct 30 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
PHP开发文件系统实例讲解
2006/10/09 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
一个实用的php验证码类
2017/07/06 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
Vue实现todo应用的示例
2021/02/20 Vue.js
Python之eval()函数危险性浅析
2014/07/03 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
python如何定义带参数的装饰器
2018/03/20 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
树莓派升级python的具体步骤
2020/07/05 Python
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
施工资料员的岗位职责
2013/12/22 职场文书
活动总结的格式
2014/05/07 职场文书
服务宗旨标语
2014/07/01 职场文书
给上级领导的感谢信
2015/01/22 职场文书
企业工会工作总结2015
2015/05/13 职场文书
孟佩杰观后感
2015/06/17 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
教你用python控制安卓手机
2021/05/13 Python
Element实现动态表格的示例代码
2021/08/02 Javascript