分享

Django之添加 修改 删除 实例

 怎么了啊早上 2014-04-19
初学Django,可能通过一些实例学习,比看满屏的E文更有效些,所以写了一个实例来展示一下Django的添加 修改 删除三个基本操作。希望对想学Django的朋友有所帮助。本文只适合刚开始了解Django的人,有实战的朋友请跳过。前提条件 已经配置好Django环境,如果还没有配置好,请参考之前的 Windows下配置Django开发环境

1 新建一个Django项目Project,在Dos控制台上,选定项目的存放目录,然后执行:
django-admin.py startproject django_aud
进入刚刚生成的项目目录下 cd django_aud,发现了四个py文件:__init__.py manage.py url.py settings.py,说明项目创建成功。

2 新建一个App,在Dos控制台上执行:
cd django_aud
manage.py startapp blog
这时你发现了多了一个文件夹blog,里面也有 四个py文件 __init__.py models.py tests.py views.py 说明App创建成功。

3 配置项目
数据库选用python库里自带的sqlite3,在项目的根目录下,编辑 settings.py:
DATABASE_ENGINE = 'sqlite3'         
DATABASE_NAME = 'db'            
给DATABASE_ENGINE赋值,指定了项目使用的数据库的类型;给DATABASE_NAME赋值,指定了数据库的名字。
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'blog',
)
最后的一行'blog',是把我们刚才新建的App blog附加到整个项目中。它上面的四行代码是 django自动生成的必要App,不用理会他们。

编辑项目的urls.py,给App blog指定urls,我们暂时加入
url(r'^blog/', include('blog.urls'),name="blog_index"),
注意include函数的参数 是blog.urls,但是我们在App blog下,还没有创建urls.py,后面我们会加上去。

4 编写blog App。
我们用一个最简单的blog实体做示范;首先先加入 模块:urls.py 和forms.py 和存放html文件的文件夹templates/blog/
App 的文件结构:
-blog
--templates
----blog
--models.py
--urls.py
--forms.py
--views.py
--__init__.py

步骤1:定义blog的models实体:
#coding=utf-8
from django.db import models

class Blog(models.Model):
    title=models.CharField(u"标题",max_length=60)
    content=models.TextField(u"正文")
    created_at=models.DateTimeField(u"建立时间",auto_now_add=True)
    updated_at=models.DateTimeField(u"修改时间",auto_now=True)
    def __uncode__(self):
        return self.title
    class Meta:
        ordering = ['-updated_at','-created_at']
说明:定义了Blog类,它就相当一个blog表,表里有title content和created_at updated_at。max_length是必须的参数,指定字段的长度。auto_now_add表示添加一条记录的时候,时间自动插入当前的时间,auto_now=True表示第一次添加记录的时候,插入当前时间,如果是修改记录的时候,时间给替换成修改的时间。ordering 是记录集的 排序,如上,首先根据 记录的更新时间降序排序,再更建立时间降序排。如果不指定该子类,记录集将按照记录的建立时间 升序排序。

步骤2:定义blog的urls:
#coding=utf-8
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^add/$', 'blog.views.add',name="blog_add"),
    url(r'^list/$', 'blog.views.list',name="blog_list"),
    url(r'^update-(?P<id>\d+)/$', 'blog.views.update',name="blog_update"),
    url(r'^delete-(?P<id>\d+)/$', 'blog.views.delete',name="blog_delete"),
)
说明:blog的urls,实际就是一个页面的链接地址,如上定义了四条链接地址,name可以看做页面的名字。urls 会根据浏览器上的链接输入,定向到步骤4 views的具体action中指定的函数。如blog_add的“blog.views.add”,说明会定向到App blog下的views.py add函数,执行该函数的动作。最好理解的比方就是 在浏览器上输入:
http://127.0.0.1:8000/blog/add/ 后 Django会根据浏览器的地址,执行blog下views.py add函数。

步骤3:定义blog的forms:
#coding=utf-8
from django.forms import ModelForm
from models import Blog

class AddForm(ModelForm):
    class Meta:
        model=Blog
说明:Django的form作用就是生成表单,比如文本输入框等。上面的例子,是根据models下的Blog类,生成Blog的表单。我们添加 修改数据的时候,就有输入口了。

步骤4:集中精力写blog的views
#coding=utf-8
from django.shortcuts import render_to_response,get_object_or_404
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from models import Blog
from forms import AddForm

def list(request):
    list=Blog.objects.all()
    return render_to_response('blog/list.html', {'list': list})
def add(request):
    if request.method=="POST":
        form=AddForm(request.POST)
        if form.is_valid():
            blog=form.save()
            #blog.save()
            return HttpResponseRedirect(reverse("blog_list"))
    return render_to_response('blog/add.html', {'form': AddForm()})
def update(request,id):
    blog=get_object_or_404(Blog,pk=int(id))
    if request.method=="POST":
        form=AddForm(request.POST,instance=blog)
        if form.is_valid():
            blog=form.save()
            #blog.save()
            return HttpResponseRedirect(reverse("blog_list"))
    return render_to_response('blog/add.html', {'form': AddForm(instance=blog)})
def delete(request,id):
    blog=get_object_or_404(Blog,pk=int(id))    
    blog.delete()
    return HttpResponseRedirect(reverse("blog_list"))
说明:views是实例中最重点的部分。里面定义的函数,直接和urls关联,一个urls地址关联一个views的函数。list函数,表示取出数据库对应blog表的全部记录,然后把数据渲染到指定的html模板中。浏览器上才能看到结果。

步骤5:给每个页面写html代码。我们的实例一共有4个页面blog_list blog_add blog_update blog_delete,除了不需要写blog_delete外(delete删除我们的做法是利用一个a链接触发views的delete函数,把记录删除后返回到列表页blog_list,所以暂时不需要html页面),其他的页面有3个,我把关键的代码贴出来:
list.html 
{%for blog in list%}<div style="border-bottom:1px dotted #ccc;">
<h3>{{blog.title}}</h3>
<p>{{blog.content}}</p>
<p><a href="{%url blog_add%}">添加</a>  <a href="{%url blog_update blog.id%}">修改</a>
    <a href="{%url blog_delete blog.id%}" onclick="return confirm('你确认要删除吗?')">删除</a></p>
</div>
{%endfor%}

add.html update.html
<form method="post" >
<table>
{{form.as_table}}
</table>
<input type="submit"/> <a href="{%url blog_list%}">返回列表</a>
</form>

实例就算完成了。回到Dos下。执行:
manage.py syncdb
根据blog实体生成相应的数据库表,django会根据你步骤1的Blog实体类的定义生成一个表(当然也会生成必要的表,根据项目配置文件settings.py的INSTALLED_APPS而定)。
manage.py runserver
启动web内置服务器
打开浏览器输入:http://127.0.0.1:8000/blog/list/ 就可以看到我们的实例效果了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多