django ajax 增删改查,python django todolist 增删改查

47d11ede2013

image.png

git:https://github.com/huangantai/todolist.git

1、

pip install django=='2.1'

django-admin startproject todolist

django-admin startapp simpletodo

pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2

2、settings.py 和 urls.py 设置

settings.py (注释csrf中间件)

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'simpletodo',

'xadmin',

'crispy_forms',

'reversion',

]

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

TEMPLATES = [

{

'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': [os.path.join(BASE_DIR, 'templates')],

'APP_DIRS': True,

'OPTIONS': {

'context_processors': [

'django.template.context_processors.debug',

'django.template.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',

],

},

},

]

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, '/static/')

urls.py

from django.urls import path,include

from simpletodo import views

import xadmin

xadmin.autodiscover()

from xadmin.plugins import xversion

xversion.register_models()

urlpatterns = [

path('admin/', xadmin.site.urls),

path(r'', views.todolist),

path(r'simpletodo/',include('simpletodo.urls'))

]

python manage.py makemigrations

python manage.py migrate

python manage.py createsuperuser

python manage.py collectstatic

3、simpletodo/models.py adminx.py urls.py views.py

models.py

from django.db import models

from django.contrib.auth.models import User

Create your models here.

class Todo(models.Model):

id=models.AutoField(primary_key=True)

user = models.ForeignKey(User,on_delete=models.CASCADE)

todo = models.CharField(max_length=50)

flag = models.CharField(max_length=2)

priority = models.CharField(max_length=2)

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']

adminx.py

import xadmin

from simpletodo.models import Todo

Register your models here.

class TodoAdmin(object):

list_display = ['user', 'todo', 'priority', 'flag', 'pubtime']

list_filter = ['pubtime','priority']

ordering = ['-pubtime']

list_editable=['todo','priority','flag']

xadmin.site.register(Todo, TodoAdmin)

[root@centos8 simpletodo]# vi adminx.py

[root@centos8 simpletodo]# cat adminx.py

from xadmin import views

import xadmin

class BaseSetting(object):

"""xadmin的基本配置"""

enable_themes = True # 开启主题切换功能

use_bootswatch = True

class GlobalSettings(object):

"""xadmin的全局配置"""

site_title = "todolist" # 设置站点标题

site_footer = "-todolist-" # 设置站点的页脚

menu_style = "accordion" # 设置菜单折叠

xadmin.site.register(views.CommAdminView, GlobalSettings)

xadmin.site.register(views.BaseAdminView, BaseSetting)

from simpletodo.models import Todo

Register your models here.

class TodoAdmin(object):

list_display = ['user', 'todo', 'priority', 'flag', 'pubtime']

list_filter = ['pubtime','priority']

ordering = ['-pubtime']

list_editable=['todo','priority','flag']

xadmin.site.register(Todo, TodoAdmin)

urls.py

!/usr/bin/python

-- coding: utf-8 --

from django.contrib import admin

from django.urls import path,include

from simpletodo import views

urlpatterns = [

path(r'',views.todolist),

path(r'addtodo/', views.addtodo,name='add'),

path(r'todofinish/', views.todofinish,name='finish'),

path(r'todobackout/', views.todoback,name='backout'),

path(r'updatetodo/', views.updatetodo,name='update'),

path(r'tododelete/', views.tododelete,name='delete')

]

views.py

from django.shortcuts import render,render_to_response

from django.contrib.auth.models import User

from django.http import HttpResponseRedirect

from django.template import RequestContext

from django.http import Http404

from simpletodo.models import Todo

Create your views here.

def todolist(request):

todolist=Todo.objects.filter(flag="1")

finishtodos=Todo.objects.filter(flag="0")

return render_to_response('simpletodo.html',{'todolist':todolist,'finishtodos':finishtodos})

def todofinish(request,id=''):

todo=Todo.objects.get(id=id)

print(todo.flag,id)

if todo.flag=="1":

todo.flag="0"

todo.save()

return HttpResponseRedirect('/simpletodo/')

def todoback(request,id=''):

todo=Todo.objects.get(id=id)

if todo.flag=="0":

todo.flag="1"

todo.save()

return HttpResponseRedirect('/simpletodo/')

def tododelete(request,id=''):

try:

todo=Todo.objects.get(id=id)

except Exception:

raise Http404

if todo:

todo.delete()

return HttpResponseRedirect('/simpletodo/')

def addtodo(request):

if request.method=='POST':

atodo=request.POST['todo']

priority=request.POST['priority']

if not priority:priority=0

user = User.objects.get(id='1')

todo = Todo(user=user, todo=atodo, priority=priority, flag="1")

todo.save()

todolist = Todo.objects.filter(flag="1")

finishtodos = Todo.objects.filter(flag="0")

return render_to_response('showtodo.html',{'todolist': todolist, 'finishtodos': finishtodos})

else:

todolist = Todo.objects.filter(flag="1")

finishtodos = Todo.objects.filter(flag="0")

return render_to_response('simpletodo.html',{'todolist': todolist, 'finishtodos': finishtodos})

def updatetodo(request,id=''):

if request.method == 'POST':

atodo = request.POST['todo']

priority = request.POST['priority']

user = User.objects.get(id='1')

todo=Todo.objects.get(id=id)

todo.todo=atodo

todo.priority=priority

todo.save()

todolist = Todo.objects.filter(flag="1")

finishtodos = Todo.objects.filter(flag="0")

return render_to_response('simpletodo.html',{'todolist': todolist, 'finishtodos': finishtodos})

else:

try:

todo = Todo.objects.get(id=id)

except Exception:

raise Http404

return render_to_response('updatatodo.html', {'todo': todo})

4、templates/simpletodo.html updatatodo.html showtodo.html

simpletodo.html

{% block title %}Simple Todo{% endblock %}

{% block extra_head %}

body {padding-top: 40px;}

.ftodo{text-decoration : line-through ; }

textarea{ width: 97%;

padding: 5px;

font-size: 14px;

resize: vertical;}

function sendtwitter(){

math?formula=('%23myModal%20form').submit(function()%7B.ajax({

type: "POST",

data:

math?formula=('%23myModal%20form').serialize()%2C%20url%3A%20%22%7B%25%20url%20'add'%20%25%7D%22%2C%20cache%3A%20false%2C%20dataType%3A%20%22html%22%2C%20success%3A%20function(html%2C%20textStatus)%20%7B('#todo').replaceWith(html);

math?formula=('%23myModal').modal('hide')%3B('#myModal form')[0].reset();

},

error: function (XMLHttpRequest, textStatus, errorThrown) {

math?formula=('%23comment_form%20form').replaceWith('Your%20comment%20was%20unable%20to%20be%20posted%20at%20this%20time.%20We%20apologise%20for%20the%20inconvenience.')%3B%20%7D%20%7D)%3B%20return%20false%3B%20%7D)%3B%20%7D(document).ready(function(){

sendtwitter();

})

{% endblock %}

{% block todo %}

待办事项

{% for todo in todolist %}

{% if todo.priority == '1' %}

{% endif %}

{% if todo.priority == '2' %}

{% endif %}

{% if todo.priority == '3' %}

{% endif %}

{{ todo.todo }}{{ todo.pubtime|date:'Y-m-d'}}

{% endfor %}

{% for ftodo in finishtodos %}

{{ ftodo.todo }}{{ ftodo.pubtime|date:'Y-m-d'}}

{% endfor %}

ADD

{% endblock %}

updatatodo.html

{% extends 'simpletodo.html'%}

{% block title %} update Todo {% endblock %}

{% block todo %}

{% csrf_token %}

{% endblock %}

showtodo.html

{% block todo %}

待办事项

{% for todo in todolist %}

{% if todo.priority == '1' %}

{% endif %}

{% if todo.priority == '2' %}

{% endif %}

{% if todo.priority == '3' %}

{% endif %}

{{ todo.todo }}

{% endfor %}

{% for ftodo in finishtodos %}

{{ ftodo.todo }}

{% endfor %}

ADD

{% endblock %}

5、static/css js img

css

bootstrap.min.css

img

glyphicons-halflings.png glyphicons-halflings-white.png

js

ajaxpost.js bootstrap.js bootstrap.min.js jquery.js modernizr.js

math?formula=(document).ajaxSend(function(event%2C%20xhr%2C%20settings)%20%7B%20function%20getCookie(name)%20%7B%20var%20cookieValue%20%3D%20null%3B%20if%20(document.cookie%20%26%26%20document.cookie%20!%3D%20'')%20%7B%20var%20cookies%20%3D%20document.cookie.split('%3B')%3B%20for%20(var%20i%20%3D%200%3B%20i%20%3C%20cookies.length%3B%20i%2B%2B)%20%7B%20var%20cookie%20%3D%20jQuery.trim(cookies%5Bi%5D)%3B%20%2F%2F%20Does%20this%20cookie%20string%20begin%20with%20the%20name%20we%20want%3F%20if%20(cookie.substring(0%2C%20name.length%20%2B%201)%20%3D%3D%20(name%20%2B%20'%3D'))%20%7B%20cookieValue%20%3D%20decodeURIComponent(cookie.substring(name.length%20%2B%201))%3B%20break%3B%20%7D%20%7D%20%7D%20return%20cookieValue%3B%20%7D%20function%20sameOrigin(url)%20%7B%20%2F%2F%20url%20could%20be%20relative%20or%20scheme%20relative%20or%20absolute%20var%20host%20%3D%20document.location.host%3B%20%2F%2F%20host%20%2B%20port%20var%20protocol%20%3D%20document.location.protocol%3B%20var%20sr_origin%20%3D%20'%2F%2F'%20%2B%20host%3B%20var%20origin%20%3D%20protocol%20%2B%20sr_origin%3B%20%2F%2F%20Allow%20absolute%20or%20scheme%20relative%20URLs%20to%20same%20origin%20return%20(url%20%3D%3D%20origin%20%7C%7C%20url.slice(0%2C%20origin.length%20%2B%201)%20%3D%3D%20origin%20%2B%20'%2F')%20%7C%7C%20(url%20%3D%3D%20sr_origin%20%7C%7C%20url.slice(0%2C%20sr_origin.length%20%2B%201)%20%3D%3D%20sr_origin%20%2B%20'%2F')%20%7C%7C%20%2F%2F%20or%20any%20other%20URL%20that%20isn't%20scheme%20relative%20or%20absolute%20i.e%20relative.%20!(%2F%5E(%5C%2F%5C%2F%7Chttp%3A%7Chttps%3A).*%2F.test(url))%3B%20%7D%20function%20safeMethod(method)%20%7B%20return%20(%2F%5E(GET%7CHEAD%7COPTIONS%7CTRACE)/.test(method));

}

if (!safeMethod(settings.type) && sameOrigin(settings.url)) {

xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));

}

});

6、修改settings.py

STATIC_ROOT = os.path.join(BASE_DIR, '/static')

STATICFILES_DIRS = [os.path.join(BASE_DIR,'static'),]

7、

python manage.py makemigrations

python manage.py migrate

python runserver 0.0.0.0:9999 &

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值