今天无意间看到  simple-todo: 一个简易的 todo 程序 - web.py 中文教程 ,然后发现竟然有好多的版本 http://simple-is-better.com/news/tag/simple-todo

然后看到django版的是个半成品,好吧,自己动手丰衣足食。

django 安装配置这里就不再介绍了,直接给之前的地址: django 简易博客开发 1 安装、创建、配置、admin使用

使用的环境: fedora 17 + django1.4 + python2.7 + sqlite3

前端使用的 bootstrap + jquery

实现添加修改删除 ajax支持 可自行添加用户控制

1、django安装 project 创建 、app 创建、安装、admin使用

看着个吧,这篇博客有详细教程

2、上代码

#!/usr/bin/python
# -*- coding: utf-8 -*- from django.db import models
from django_openid_auth.models import User
#之前我用过openid 这里换成 from django.contrib.auth.models import User 就可以了 class Todo(models.Model):
user = models.ForeignKey(User)
todo = models.CharField(max_length=50)
flag = models.CharField(max_length=2, default='1')
priority = models.CharField(max_length=2, default='0')
pubtime = models.DateTimeField(auto_now_add=True) def __unicode__(self):
return u'%d %s %s' % (self.id, self.todo, self.flag) class Meta:
ordering = ['priority', 'pubtime']

priority 为优先级 排序时优先级高的在前面,越小优先级越高;然后再按时间排序,越早越靠前
flag 标记是否完成 默认为1表示未完成
当然这两处改为models.IntegerField 更好一些,可以自己修改一下

创建数据库:

python manage.py syncdb

在admin查看

#!/usr/bin/python
# -*- coding: utf-8 -*- from django.contrib import admin
from simpleToDo.models import Todo class TodoAdmin(admin.ModelAdmin):
list_display = ('user', 'todo', 'priority', 'flag', 'pubtime')
list_filter = ('pubtime',)
ordering = ('-pubtime',) admin.site.register(Todo, TodoAdmin)

urls.py

#!/usr/bin/python
# -*- coding: utf-8 -*- from django.conf.urls import * urlpatterns = patterns(('simpleToDo.views'),
url(r'^$', 'todolist', name='todo'),
url(r'^addtodo/$', 'addTodo', name='add'),
url(r'^todofinish/(?P<id>\d+)/$', 'todofinish', name='finish'),
url(r'^todobackout/(?P<id>\d+)/$', 'todoback', name='backout'),
url(r'^updatetodo/(?P<id>\d+)/$', 'updatetodo', name='update'),
url(r'^tododelete/(?P<id>\d+)/$', 'tododelete', name='delete'),
)

views.py

 1 from django.shortcuts import render_to_response
2 from django.http import HttpResponseRedirect
3 from django.template import RequestContext
4 from django_openid_auth.models import User
5 from django.http import Http404
6 from simpleToDo.models import Todo
7
8
9 def todolist(request):
10 todolist = Todo.objects.filter(flag=1)
11 finishtodos = Todo.objects.filter(flag=0)
12 return render_to_response('simpleTodo.html',
13 {'todolist': todolist, 'finishtodos': finishtodos},
14 context_instance=RequestContext(request))
15
16
17 def todofinish(request, id=''):
18 todo = Todo.objects.get(id=id)
19 if todo.flag == '1':
20 todo.flag = '0'
21 todo.save()
22 return HttpResponseRedirect('/simpleTodo/')
23 todolist = Todo.objects.filter(flag=1)
24 return render_to_response('simpleTodo.html', {'todolist': todolist},
25 context_instance=RequestContext(request))
26
27
28 def todoback(request, id=''):
29 todo = Todo.objects.get(id=id)
30 if todo.flag == '0':
31 todo.flag = '1'
32 todo.save()
33 return HttpResponseRedirect('/simpleTodo/')
34 todolist = Todo.objects.filter(flag=1)
35 return render_to_response('simpleTodo.html', {'todolist': todolist},
36 context_instance=RequestContext(request))
37
38
39 def tododelete(request, id=''):
40 try:
41 todo = Todo.objects.get(id=id)
42 except Exception:
43 raise Http404
44 if todo:
45 todo.delete()
46 return HttpResponseRedirect('/simpleTodo/')
47 todolist = Todo.objects.filter(flag=1)
48 return render_to_response('simpleTodo.html', {'todolist': todolist},
49 context_instance=RequestContext(request))
50
51
52 def addTodo(request):
53 if request.method == 'POST':
54 atodo = request.POST['todo']
55 priority = request.POST['priority']
56 user = User.objects.get(id='1')
57 todo = Todo(user=user, todo=atodo, priority=priority, flag='1')
58 todo.save()
59 todolist = Todo.objects.filter(flag='1')
60 finishtodos = Todo.objects.filter(flag=0)
61 return render_to_response('showtodo.html',
62 {'todolist': todolist, 'finishtodos': finishtodos},
63 context_instance=RequestContext(request))
64 else:
65 todolist = Todo.objects.filter(flag=1)
66 finishtodos = Todo.objects.filter(flag=0)
67 return render_to_response('simpleTodo.html',
68 {'todolist': todolist, 'finishtodos': finishtodos})
69
70
71 def updatetodo(request, id=''):
72 if request.method == 'POST':
73 print 'ddd'
74 atodo = request.POST['todo']
75 priority = request.POST['priority']
76 user = User.objects.get(id='1')
77 todo = Todo(user=user, todo=atodo, priority=priority, flag='1')
78 todo.save()
79 todolist = Todo.objects.filter(flag='1')
80 finishtodos = Todo.objects.filter(flag=0)
81 return render_to_response('simpleTodo.html',
82 {'todolist': todolist, 'finishtodos': finishtodos},
83 context_instance=RequestContext(request))
84 else:
85 try:
86 todo = Todo.objects.get(id=id)
87 except Exception:
88 raise Http404
89 return render_to_response('updatatodo.html', {'todo': todo},
90 context_instance=RequestContext(request))

因为表单使用的是post方法,所以每个view 后都添加了 context_instance=RequestContext(request)

否则可能会出现这个错误

/usr/lib/python2.7/site-packages/django/template/defaulttags.py:55: UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value.  This is usually caused by not using RequestContext.
warnings.warn("A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext.")

templates 代码

<!DOCTYPE html>
<html lang="en">
<head>
<title>{% block title %}Simple Todo{% endblock %}</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/code.css">
<script src="/static/js/modernizr.js"></script>
<script src="/static/js/jquery.js"></script>
{% block extra_head %}
<style>
body {padding-top: 40px;}
.ftodo{text-decoration : line-through ; }
textarea{ width: 97%;
padding: 5px;
font-size: 14px;
resize: vertical;}
</style>
<script type="text/javascript">
function sendtwitter(){
$('#myModal form').submit(function(){
$.ajax({
type: "POST",
data: $('#myModal form').serialize(),
url: "{% url add %}",
cache: false,
dataType: "html",
success: function(html, textStatus) {
$('#todo').replaceWith(html);
$('#myModal').modal('hide');
$('#myModal form')[0].reset();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$('#comment_form form').replaceWith('Your comment was unable to be posted at this time. We apologise for the inconvenience.');
}
});
return false;
});
}
$(document).ready(function(){
sendtwitter();
})
</script>
{% endblock %}
</head>
<body>
<div class="container">
<div class="row">
<div class="span8 offset2">
<div id="todo" class="well">
{% block todo %}
<table class="table table-hover">
<thead>
<tr>
<td>
<h3 class="text-success">待办事项</h3>
</td>
</tr>
</thead>
<tbody>
{% for todo in todolist %}
{% if todo.priority == '1' %}
<tr class='error'>
{% endif %}
{% if todo.priority == '2' %}
<tr class='warning'>
{% endif %}
{% if todo.priority == '3' %}
<tr class='info'>
{% endif %}
<td class="todo">{{ todo.todo }}</td>
<td class="te">
<div class="span2">
<a href="{% url finish todo.id %}" title="finish"><i class=" icon-ok"></i></a>
<a href="{% url update todo.id %}" title="edit"><i class="icon-edit"></i></a>
<a href="{% url delete todo.id %}" title="delete"><i class="icon-trash"></i></a>
</div>
</td>
</tr>
{% endfor %}
{% for ftodo in finishtodos %}
<tr class='success'>
<td class="ftodo muted">{{ ftodo.todo }}</td>
<td class="te">
<div class="span2">
<a href="{% url backout ftodo.id %}" title="finish"><i class=" icon-repeat"></i></a>
<a href="{% url update ftodo.id %}" title="edit"><i class="icon-edit"></i></a>
<a href="{% url delete ftodo.id %}" title="delete"><i class="icon-trash"></i></a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="#myModal" role="button" data-toggle="modal">
<i class="icon-plus icon-white"></i><span > ADD</span>
</a>
{% endblock %}
</div>
</div>
</div>
</div>
<div class="modal hide fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="myModalLabel">Add TODO</h3>
</div>
<form action="" method="post">{% csrf_token %}
<div class="modal-body">
<textarea name="todo" class="txtodo" id="txtodo" required="required">{{ todo.todo }}</textarea>
<fieldset>
<label class="radio inline" for="priority">
<span class="label label-info">Priority</span>
</label>
<label class="radio inline" for="priority">
<input type="radio" name="priority" value="1"/>
<span class="label label-important">重要</span>
</label>
<label class="radio inline" for="priority">
<input type="radio" name="priority" value="2"/>
<span class="label label-warning">警告</span>
</label>
<label class="radio inline" for="priority">
<input type="radio" name="priority" value="3"/>
<span class="label label-success">成功</span>
</label>
</fieldset>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<button id="send" class="btn btn-success" type="submit" name="submit" >Save changes</button>
</div>
</form>
</div>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>

 1 <div id="todo">
2 <table class="table table-hover">
3 <thead>
4 <tr>
5 <td>
6 <h4>todo</h4>
7 </td>
8 <td>
9 <a class="btn btn-success" href="#myModal" role="button" data-toggle="modal">
10 <i class="icon-plus icon-white"></i><span > ADD</span>
11 </a>
12 </td>
13 </tr>
14 </thead>
15 <tbody>
16 {% for todo in todolist %}
17 {% if todo.priority == '1' %}
18 <tr class='error'>
19 {% endif %}
20 {% if todo.priority == '2' %}
21 <tr class='warning'>
22 {% endif %}
23 {% if todo.priority == '3' %}
24 <tr class='info'>
25 {% endif %}
26 <td class="todo">{{ todo.todo }}</td>
27 <td class="te">
28 <div class="span2">
29 <a href="{% url finish todo.id %}" title="finish"><i class=" icon-ok"></i></a>
30 <a href="{% url updateblog todo.id %}" title="edit"><i class="icon-edit"></i></a>
31 <a href="{% url delete todo.id %}" title="delete"><i class="icon-trash"></i></a>
32 </div>
33 </td>
34 </tr>
35 {% endfor %}
36 {% for ftodo in finishtodos %}
37 <tr class='success'>
38 <td class="todo muted">{{ ftodo.todo }}</td>
39 <td class="te">
40 <div class="span2">
41 <a href="{% url backout ftodo.id %}" title="finish"><i class=" icon-ok"></i></a>
42 <a href="{# {% url updateblog blog.id %} #}" title="edit"><i class="icon-edit"></i></a>
43 <a href="{% url delete ftodo.id %}" title="delete"><i class="icon-trash"></i></a>
44 </div>
45 </td>
46 </tr>
47 {% endfor %}
48 </tbody>
49 </table>
50 </div>

 1 {% extends 'simpleTodo.html'%}
2
3 {% block title %} update Todo {% endblock %}
4
5 {% block todo %}
6 <form action="{% url update todo.id %}" method="post">{% csrf_token %}
7 <div class="modal-body">
8 <textarea name="todo" class="txtodo" id="txtodo" required="required">{{ todo.todo }}</textarea>
9 <fieldset>
10 <label class="radio inline" for="priority">
11 <span class="label label-info">Priority</span>
12 </label>
13 <label class="radio inline" for="priority">
14 <input type="radio" name="priority" value="1" {% if todo.priority == '1' %} checked{% endif %}/>
15 <span class="label label-important">重要</span>
16 </label>
17 <label class="radio inline" for="priority">
18 <input type="radio" name="priority" value="2" {% if todo.priority == '2' %} checked{% endif %}/>
19 <span class="label label-warning">警告</span>
20 </label>
21 <label class="radio inline" for="priority">
22 <input type="radio" name="priority" value="3" {% if todo.priority == '3' %} checked{% endif %}/>
23 <span class="label label-success">成功</span>
24 </label>
25 </fieldset>
26 </div>
27 <div class="modal-footer">
28 <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
29 <button id="send" class="btn btn-success" type="submit" name="submit" >Save changes</button>
30 </div>
31 </form>
32 {% endblock %}

实现效果

1、首页

2、添加事项页面

3、修改事项时页面

项目地址: https://github.com/goodspeedcheng/Django-Simple-Todo

希望大家能把错误的地方指出来,让django版todo的更好一些  谢谢

 

http://www.cnblogs.com/cacique/archive/2012/10/06/2713415.html

simple-todo: 一个简易的 todo 程序 - django版的更多相关文章

  1. 如何用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  2. 一个简易的WebServer程序

    现在这个公司的it管理真不知道说什么了,我主要从事.net方向的开发,公司电脑配置还是win7了,可是自己没有安装iis的权限,it也拒绝安装,想玩玩web安全都不行.于是乎决定开发一个window ...

  3. 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub

    github地址:https://github.com/ErhuoHome/First.git 安装jdk与intellij idea没有太大问题,以前安装过eclipse 在程序方面,由于对真分数的 ...

  4. Tinychatserver: 一个简易的命令行群聊程序

    这是学习网络编程后写的一个练手的小程序,可以帮助复习socket,I/O复用,非阻塞I/O等知识点. 通过回顾写的过程中遇到的问题的形式记录程序的关键点,最后给出完整程序代码. 0. 功能 编写一个简 ...

  5. Cocoa练习01:一个简单的Todo list程序

    写一个简单的todo list程序,界面如下图: 在TextField区域输入文字,点击Add按钮会将文字显示在下面的TableView列表中.TableView列表有2列,第一列是文字的输入时间:第 ...

  6. Python Django 编写一个简易的后台管理工具4-添加admin模版

    导入admin后台模版 可以在网上任意搜索模版,我这里也提供一个地址github 拷贝admin后台的html文件至项目的templates文件夹 创建static文件夹,将admin后台的js,im ...

  7. Vue.js 入门:从零开始做一个极简 To-Do 应用

    Vue.js 入门:从零开始做一个极简 To-Do 应用 写作时间:2019-12-10版本信息:Vue.js 2.6.10官网文档:https://cn.vuejs.org/ 前言  学习 Vue ...

  8. 使用Ant Design写一个仿微软ToDo

    实习期的第一份活,自己看Ant Design的官网学习,然后用Ant Design写一个仿微软ToDo. 不做教学目的,只是记录一下. 1.学习 Ant Design 是个组件库,想要会用,至少要知道 ...

  9. ASP.NET Core Blazor WebAssembly实现一个简单的TODO List

    基于blazor实现的一个简单的TODO List 最近看到一些大佬都开始关注blazor,我也想学习一下.做了一个小的demo,todolist,仅是一个小示例,参考此vue项目的实现http:// ...

随机推荐

  1. Java练习demo 20190402 优惠券扣减

    实体类: package org.jimmy.autosearch2019.pojo; import java.math.BigDecimal; public class TestEntity2019 ...

  2. SQL比较两表字段和字段类型

    一.问题 业务需要把TB_Delete_KYSubProject表数据恢复到TB_KYSubProject,但提示错误,错误原因是两表字段类型存在不一致 insert into [TB_KYSubPr ...

  3. 数论基础之组合数&计数问题

    一.组合数:问题引入:现在有 n 个球,取其中的 k 个球,问一共有多少种方式?答案: 公式直观解释:我们考虑有顺序地取出 k 个球:第一次有 n 种选择,第二次有 n-1 种选择,...,第 k 次 ...

  4. ICPC-Beijing 2006 狼抓兔子

    题目描述 题解: 裸的最小割. 但是最大流跑不过去怎么办? 转变一下,既然最大流是一条左下<->右上的通路,我们可以把图划分为若干区域, 最后找左下到右上的最短路就行了. 代码: #inc ...

  5. Shell函数和正则表达式

    1. shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式: func() {   #指定 ...

  6. FreeMarker与SSH项目整合流程

    FreeMarker与SSH项目整合流程 学习了SSH之后,一般为了减少数据库的压力,会使用FreeMarker来生成静态HTML页面.下面简单说一下FreeMarker与SSH项目的整合全过程~ 前 ...

  7. Linux 命令学习(1): head和tail

    版权声明:本文为博主原创文章,未经允许,不得转载. head head 命令可以将一段文本的开头一部分输出到标准输出. head命令既可以处理文本文件也可以处理标准输入. 基本应用 处理文本文件: h ...

  8. 条款27:尽量少做转型动作(Minimize casting)

    NOTE : 1.如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts. 如果有个设计需要转型动作,试着发展无需转型的替代设计. 2.如果转型是必须要的,试着将它隐藏于某个函 ...

  9. 第四天,for循环,格式化输出,占位符,pycharm安装.列表处理

    字符格式化输出 占位符 %s s = string %d d = digit 整数 %f f = float 浮点数,约等于小数 列表,元组 查 索引(下标) ,都是从0开始 切片 .count 查某 ...

  10. 【HIHOCODER 1478】 水陆距离(BFS)

    描述 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. 输入 第一行包含两个整数,N和M. ...