详解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如何拆分含有多种分隔符的字符串
Mar 20 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
python函数与方法的区别总结
Jun 23 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
Nov 25 Python
基于Python获取城市近7天天气预报
Nov 26 Python
实现Python与STM32通信方式
Dec 18 Python
如何使用python代码操作git代码
Feb 29 Python
使用K.function()调试keras操作
Jun 17 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
Python基础之Socket通信原理
Apr 22 Python
Python中的datetime包与time包包和模块详情
Feb 28 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下使用strpos需要注意 === 运算符
2010/07/17 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
js闭包实例汇总
2014/11/09 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
Python中文编码那些事
2014/06/25 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
西部世纪面试题
2014/12/05 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
2014年六一儿童节演讲稿
2014/05/23 职场文书
品质口号大全
2014/06/17 职场文书
委托证明书
2014/09/17 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2015高考寄语集锦
2015/02/27 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书