Django之添加 修改 删除 实例

本文通过一个简单的博客应用实例介绍了Django框架中的创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)操作。从项目搭建到模型定义、视图处理、表单生成直至HTML页面展示,一步步引导读者掌握Django的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
初学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/ 就可以看到我们的实例效果了。

 
 
 
如何完成Django模型对象的删除操作

我们知道Django模型对象实际上是映射了数据库中的一张表。因此,我们要删除模型对象,实际上是删除数据库表中的一条或者多条记录。删除方法是调用模型对象的delete()方法。比如,我们要删除id为1的Entry对象,可以这样操作:

>>> e =Entry. objects. get (pk = 1 )
>>> e. delete ( )

不仅仅可以通过单个模型对象的delete()方法来删除一条记录,我们还可以删除一组数据,方法是调用QuerySet对象的delete()方法。比如:

>>> Entry. objects. filter (pub_date__year = 2012 ). delete ( )

上面这行代码会删除所有发布日期是2012年的Entry记录。需要注意的是,如果我们在模型类中自定义了一个delete()方法,那么就不能调用QuerySet级别的delete()方法了(那时可能需要循环整个QuerySet,然后一个个的删除)。
另外,当我们调用一个模型对象的delete()方法时,其关联的子对象(与其有外键关联关系的对象)也会被删除。比如一个Blog有多个Entry,那么如果我们删除一个Blog,那么这个Blog包含的Entry也会被删除。比如:

b = Blog. objects. get (pk = 1 )
# 下面的代码会同时删除Blog下面的所有Entry记录。
b. delete ( )
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值