Django入门实践(3)

Django简单应用

  前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道。下面举的例子是创建一个简单应用wiki App。

  • 首先在命令行下创建app:

此时,mysite下会多出一个目录wiki,wiki/下面有四个文件:

__init__.py:表示wiki目录是一个包,可以被其它App导入 models.py:用来存放Model代码,描述数据库结构和数据接口 tests.py:演示两种风格的测试代码,用于Django App的调试 views.py:用来存放view代码,处理URL请求的Views方法
  • 修改wiki/models.py,创建数据模型:
from django.db import models  # Create your models here. class Wiki(models.Model):     pagename = models.CharField(max_length=20, unique=True)     content = models.TextField()

  这里Wiki是model的名字,它是models.Model的子类,它的两个属性分别是models.CharField和models.TextField的实例。pagename用来保存页面的名字,最大长度为20个字符,且不能重复;content用来保存页面内容。

安装wiki app,每个app创建后都需要手动安装

  • 修改settings.py,安装app:

在settings.py中找到“INSTALLED_APPS”,修改为:

INSTALLED_APPS = (     ‘django.contrib.auth‘,     ‘django.contrib.contenttypes‘,     ‘django.contrib.sessions‘,     ‘django.contrib.sites‘,     ‘django.contrib.messages‘,     ‘django.contrib.staticfiles‘,     # Uncomment the next line to enable the admin:     # ‘django.contrib.admin‘,     # Uncomment the next line to enable admin documentation:     # ‘django.contrib.admindocs‘,     ‘wiki‘,    <==加入此句 )

  • 初始化数据库:

  这一步是根据wiki/models.py在数据库中创建相应的表。执行manage.py syncdb来同步数据库。在这之前要决定使用何种数据库,并且在settings.py中配置相关数据库项。仅为入门,so,我使用的是python3.5+自带的文件数据库sqlite3(需要建一个db文件,如mysite.db),使用自带的sqlite3的话,只需写ENGINE和NAME参数即可。

    • 修改settings.py文件,配置数据库参数:

DATABASES = {     ‘default‘: {         ‘ENGINE‘: ‘django.db.backends.sqlite3‘, # Add ‘postgresql_psycopg2‘, ‘mysql‘, ‘sqlite3‘ or ‘oracle‘.         ‘NAME‘: ‘C:/Python27/Scripts/mysite/mysite.db‘,  # Or path to database file if using sqlite3.         ‘USER‘: ‘‘,                      # Not used with sqlite3.         ‘PASSWORD‘: ‘‘,                  # Not used with sqlite3.         ‘HOST‘: ‘‘,                      # Set to empty string for localhost. Not used with sqlite3.         ‘PORT‘: ‘‘,                      # Set to empty string for default. Not used with sqlite3.     } }

    • 同步数据库,此步骤会创建models中定义的表(包括系统的和自定义的):

第一次会创建会要求创建一个超级用户账号,manage.py syncdb命令可以多次运行,不会重复创建表。

这里错了,应该是manage.py makemigrations   然后在是manage.py  migrate

先不急下面的操作,先来验证我们的数据库可否操作。创建好表后,进入python环境,来进行一些简单的数据库操作

    • 运行manage.py shell进入python环境进行相关数据库测试:

使用命令行来创建一个名为FrontPage的首页

这里的FontPage在wiki.views里面用来判断是否是第一页,因为我输入的是‘a’ ,所以卡了很久很久很久

  • 修改wiki/views.py,添加edit和save函数:

 

#-*- coding:utf-8 -*-

# Create your views here.

from django.http import HttpResponse,HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import loader,Context
from wiki.models import Wiki   
#注意 这里虽然都是wiki文件夹,但是如果不在models前面加入wiki则会报错,所以引用包即使在同一个包里面的另一个py文件也要把报名给搞上去,这是教训,搞了好久好久
def index(request,pagename=‘‘):
    ‘‘‘显示一半页面,对页面内容做链接处理‘‘‘
    if pagename:
    #如果提供了页面的名字,则查找页面是否已经存在
        pages = Wiki.objects.filter(pagename=pagename)
        if pages:
            #如果页面已存在,则调用模板来显示
            return process(‘wiki/page.html‘, pages[0])
        else:
            #如果页面不存在,则进入编辑界面
            return render_to_response(‘wiki/edit.html‘, {‘pagename‘:pagename})
    else:
        #如果没有提供页面的名字,则显示首页
        page = Wiki.objects.get(pagename=‘FrontPage‘)
        return process(‘wiki/page.html‘, page)

def edit(request, pagename):
    ‘‘‘显示编辑页面‘‘‘
    page = Wiki.objects.get(pagename=pagename)
    return render_to_response(‘wiki/edit.html‘, {‘pagename‘:pagename, ‘content‘:page.content})

def save(request, pagename):
    ‘‘‘保存页面内容并转到更新后的页面,如果页面已存在则更新它的内容,
    如果页面不存在,则新建这个页面‘‘‘
    content = request.POST[‘content‘]
    pages = Wiki.objects.filter(pagename=pagename)

    if pages:
        pages[0].content = content
        pages[0].save()
    else:
        page = Wiki(pagename=pagename, content=content)
        page.save()
    return HttpResponseRedirect(‘/wiki/%s‘ % pagename)

import re
r = re.compile(r‘\b(([A-Z]+[a-z]+){2,})\b‘)
def process(template, page):
    ‘‘‘处理页面链接,并将换行符转换为</br>‘‘‘
    t = loader.get_template(template)
    content = r.sub(r‘<a href="/wiki/\1">\1</a>‘, page.content)
    content = re.sub(r‘[\n\r]+‘, ‘<br/>‘, content)
    c = Context({‘pagename‘:page.pagename, ‘content‘:content})
    return HttpResponse(t.render(c))
  • 在templates目录下单独为wiki建立一个目录,用来存放相关wiki的template,并且在settings.py的TEMPLATE_DIR中再加入一条模板文件的路径:

TEMPLATE_DIRS = (     ‘C:/Python27/Scripts/mysite/templates‘,     ‘C:/Python27/Scripts/mysite/templates/wiki‘, <==添加此句     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".     # Always use forward slashes, even on Windows.     # Don‘t forget to use absolute paths, not relative paths. )

    • 创建文件:templates/wiki/page.html
<h2>{{ pagename }}</h2> <p>{{ content|safe }}</p> <hr> <p><form method="post" action="/wiki/{{ pagename }}/edit/"> <input type="submit" value="编辑"> </form></p>
    • 创建文件:templates/wiki/edit.html
<h2>编辑:{{ pagename }}</h2> <form method="post" action="/wiki/{{ pagename }}/save/"> <textarea name="content" rows="10" cols="50">{{ content }}</textarea><br/> <input type="submit" value="保存"> </form>
  • 修改urls.py,绑定相关views的函数:

可以这么写:

urlpatterns = patterns(‘‘,     url(r‘^$‘,hello),     url(r‘^add/$‘,add),     url(r‘^list/$‘,addressbook),     url(r‘csv/(?P<filename>\w+)/$‘,output),      url(r‘^login/$‘,login),     url(r‘^logout/$‘,logout),     
url(r‘^wiki/$‘,wiki_views.index,name=‘index‘),url(r‘^wiki/(?P<pagename>\w+)/$‘,wiki_views.index,name=‘index‘),url(r‘^wiki/(?P<pagename>\w+)/edit/$‘,wiki_views.edit,name=‘edit‘),url(r‘^wiki/(?P<pagename>\w+)/save/$‘, wiki_views.save,name=‘save‘),(Python3.5写法)
还要在前面import :
from wiki import views as wiki_views 





差不多了,可以启动web服务了,启动服务之前,先看下目录结构吧~~~:

  • 启动web服务(python manage.py runserver 1234):

点击“编辑”,如下:

  至此,Django的MTV演示完毕,但是更复杂的东西有待挖掘。回眸一望,它的流程是:添加views方法——>添加模板——>修改settings.py——>修改urls.py

url跳转,执行views里面的方法,而views里面的方法要用到模板和数据库等,大概是这样吧

时间: 2024-10-21 21:48:33

Django入门实践(3)的相关文章

Django入门与实践 17-26章总结

Django入门与实践-第17章:保护视图 Django 有一个内置的视图装饰器 来避免它被未登录的用户访问: 现在如果用户没有登录,将被重定向到登录页面: 现在尝试登录,登录成功后,应用程序会跳转到原来所在的位置. Django入门与实践-第18章:访问已登录用户 现在我么可以改进 new_topic 视图,将发布主题的用户设置当前登录的用户,取代之前直接从数据库查询出来的第一个用户, 之前这份代码是临时的,因为那时候还没有方法去获取登录用户,但是现在可以了: 有两个关键字参数,pk用于唯一标

django入门 -- 简单流程

django入门 -- 简单流程 这里简单的演示完成一个 django 大概流程,后面会有详细解释 搭建开发环境 以下使用的是 ubuntu 系统 在生产环境中,有的时候,我们开发的项目可能用的是几个不同的 环境,所以通常我们会创建虚拟环境,在虚拟环境中安装我们需要的 配置,这里从配置虚拟环境开始 创建虚拟环境 创建:mkvirtualenv [虚拟环境名称] 删除:rmvirtualenv [虚拟环境名称] 进入:workon [虚拟环境名称] 退出:deactivate 所有的虚拟环境,都位

scrapy入门实践1

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 这就是整个Scrapy的架构图了: 各部件职能: Scrapy Engine: 这是引擎,负责Spiders.ItemPipeline.Downloader.Scheduler中间的通讯,信号.数据传递等 Scheduler(调度器): 它负责接受引擎发送过来的requests请求,并按照一定的方式进行整理排列,入队.并等待Scrapy Engine(引擎)来请

VS单元测试入门实践教程

摘要:本教程不会介绍单元测试的基本理论知识,也不会和大家讨论在实际项目中是否需要写单元测试代码的问题.但是如果你此时想使用VS中的单元测试的工具来测试某个方法是否正确,可你又从来没真正实践过,那么本教程将带你一步一步使用VS2010集成的Unit Test进行断言(Assert)式验证数据的正确性,及代码覆盖率的查看. 关键词:Unit Test.单元测试.代码覆盖率.Assert.Twifly 正文: 在本入门教程中我们假设来测试一个简单的加法运算方法是否正确.该方法能够接受任意个参数,参数类

Docker快速入门实践-纯干货文章

Docker快速入门实践-纯干货文章,如果细看还能发现讲解视频呦!小伙伴们赶紧猛戳吧! Docker快速入门实践-纯干货文章 老男孩教育2016启用最新的官方博文地址: http://blog.oldboyedu.com/ 欢迎小伙伴们收藏关注,干货连连!

sass、less和stylus的安装使用和入门实践

刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用css预处理器来合作,是一种很痛苦,即使不痛苦那也是需要花费非常多的时间来协调合作上的.对于预处 理器的态度,目前是本着学习新技术和推动css向前进的思想来学习新玩意.下面这篇文章来自w3cplus,这是一篇非常强大的文章,私以为互联网上介绍这方面知识的就属这篇文章是鼻祖了. 经过了这篇文章的学习,我

Django入门笔记

Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有Django需要的依赖包 编辑器:Aptana,一个强大的IDE工具,可以在上边新建模板,支持各种语言 Django项目创建 **可以用附件中的工程目录或者自己新建 新建工程-创建Django 新建工程-配置Django工程 工程创建完成后,会在工程目录中自动创建以下几个py文件 settings.

Django项目实践4 - Django网站管理(后台管理员)

http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类站点, 管理界面 是基础设施中很重要的一部分. 这是以网页和有限的可信任管理者为基础的界面,它能够让你加入,编辑和删除站点内容. 常见的样例: 你能够用这个界面公布博客,后台的站点管理者用它来润色读者提交的内容,你的客户用你给他们建立的界面工具更新新闻并公布在站点上.这些都是使用管理界面的样例. 创

python16_day15【Django入门】

一.Django基本 1.什么是框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演.对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 import socket 2 3 def handle_request(client): 4 5 buf = client.recv(1024) 6 client.send("HTTP