Django教程(一)- Django视图与网址

目录:

1.简介

MVC

  • 大部分开发语言中都有MVC框架
  • MVC框架的核心思想是:解耦
  • 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
  • m表示model,主要用于对数据库层的封装
  • v表示view,用于向用户展示结果
  • c表示controller,是核心,用于处理请求、获取数据、返回结果

MVT

  • Django是一款python的web开发框架
  • 与MVC有所不同,属于MVT框架
  • m表示model,负责与数据库交互
  • v表示view,是核心,负责接收请求、获取数据、返回结果
  • t表示template,负责呈现内容到浏览器

Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!

Django官方网站
Django官方文档
安装Django官方文档介绍

Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。

BSD:BSD许可证是随着加州大学伯克利分校发布BSD UNIX发展起来的,修改版本被Apple、Apache所采用。BSD协议是“宽容自由软件许可证”中的一员,在软件复用上给予了最小限度的限制。

BSD协议允许作者使用该协议下的资源,将其并入私人版本的软件,该软件可使用闭源软件协议发布。

2.环境搭建

  1. 下载Ubuntu 镜像文件
    地址一
    地址二
    地址三

  2. 安装ubuntu

  3. 安装pip,使用以下合适的代码安装

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-pip

对于Python开发用户来讲,PIP安装软件包是家常便饭。但国外的源下载速度实在太慢,浪费时间,而且好多软件总是被墙,所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以解决被墙导致的装不上库的烦恼,提高安装成功率。网上有很多可用的源,这里推荐的是清华大学的pip源,它是官网pypi的镜像,每隔5分钟同步一次。

Linux下,修改 ~/.pip/pip.conf (没有就创建一个),按下Ctrl + H 可以看到隐藏文件,修改 index-url至tuna,内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

4.利用pip安装 Django(推荐使用1.11版本)

(sudo)pip install Django
或者 (sudo) pip install Django==1.8.16 
或者 pip install Django==1.11

检查是否安装成功

>>> import django
>>> django.VERSION
(1, 11, 'final', 0)
>>> 
>>> django.get_version()
'1.11'

5.安装Rest FrameWork

  • 安装
pip install djangorestframework 
  • 配置
INSTALLED_APPS = [
  ...
 'rest_framework', #配置 rest_framework app
  ...
]

3.安装pycharm

  1. 下载JDK

  2. 解压
    输入命令:tar zvxf jdk-8u131-linux-x64.tar.gz

  3. 创建jvm文件
    输入命令:sudo mkdir /usr/lib/jvm

  4. 移动到/usr/lib/jvm下
    输入命令:sudo mv jdk1.8.0_131/ /usr/lib/jvm/
    注意:如果没有jvm文件,执行该语句虽然会自动创建jvm文件,但只会把jdk1.8.0_25里面的文件都放到jvm中,而不是把jdk1.8.0_25及其里面的文件放到jvm文件中,两者是有区别的

  5. 设置JDK环境变量
    (也有在/.bashrc修改的,区别是:/etc/profile的设置方法对所有登陆用户都有效/.bashrc只对当前用户有效)
    输入命令:sudo vim ~/.profile
    编辑:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
  1. 使修改立刻生效source ~/.profile
  2. 验证JDK
    输入命令:java -version

4.Ubuntu下 正确安装VMware Tools

为了实现可以从windows拖拽文件到ubuntu,可以安装VMware Tools

5.Django主要模块

  • urls.py
    网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。

  • views.py
    处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。

  • models.py
    与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。

  • forms.py
    表单,用户在浏览器上输入数据提交,对数据的验证工作以及输入框的生成等工作,当然你也可以不使用。

  • templates 文件夹
    views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。

  • admin.py
    后台,可以用很少量的代码就拥有一个强大的后台。

  • settings.py
    Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。

6.Django基本命令

  • 新建一个 django project
django-admin.py startproject project_name
特别是在 windows 上,如果报错,尝试用 django-admin 代替 django-admin.py 试试

注意 project_name 是自己的项目名称,需要为合法的 Python 包名,如不能为 1a 或 a-b。

  • 新建 app
    要先进入项目目录下,cd project_name 然后执行下面的命令(下同,已经在项目目录下则不需要 cd project_name)
python manage.py startapp app_name
或 django-admin.py startapp app_name

一般一个项目有多个app, 当然通用的app也可以在多个项目中使用。
与项目名类似 app name 也需要为合法的 Python 包名,如 blog,news, aboutus 等都是合法的 app 名称。

  • 创建数据库表 或 更改数据库表或字段
Django 1.7.1及以上 用以下命令
# 1. 创建更改的文件
python manage.py makemigrations
# 2. 将生成的py文件应用到数据库
python manage.py migrate
 
 
旧版本的Django 1.6及以下用
python manage.py syncdb

这种方法可以在SQL等数据库中创建与models.py代码对应的表,不需要自己手动执行SQL。
备注:对已有的 models 进行修改,Django 1.7之前的版本的Django都是无法自动更改表结构的,不过有第三方工具 south

  • 使用开发服务器
    开发服务器,即开发时使用,一般修改代码后会自动重启,方便调试和开发,但是由于性能问题,建议只用来测试,不要用在生产环境。
python manage.py runserver
 
# 当提示端口被占用的时候,可以用其它端口:
python manage.py runserver 8001
python manage.py runserver 9999
(当然也可以kill掉占用端口的进程)
 
# 监听机器所有可用 ip (电脑可能有多个内网ip或多个外网ip)
python manage.py runserver 0.0.0.0:8000
# 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器
# 访问对应的 ip加端口,比如 http://172.16.20.2:8000
  • 清空数据库
python manage.py flush

此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。

  • 创建超级管理员
python manage.py createsuperuser
 
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
 
# 修改 用户密码可以用:
python manage.py changepassword username
  • Django 项目环境终端
python manage.py shell

7. Django视图与网址

1.Django中网址是写在 urls.py 文件中,用正则表达式对应 views.py 中的一个函数(或者generic类)。

  1. 新建一个项目(project), 名称为 zebk
django-admin startproject zebk

备注: 如果 django-admin 不行,请用 django-admin.py

  1. 新建一个应用(app), 名称叫 zhong
python manage.py startapp zhong  # zhong 是一个app的名称
  1. 注:Django 1.8.x 以上的,还有一个 migrations 文件夹。Django 1.9.x 还会在 Django 1.8 的基础上多出一个 apps.py 文件。

把我们新定义的app加到settings.py中的INSTALL_APPS中
修改 mysite/mysite/settings.py

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
 
    'zhong',
)

作用:新建的 app 如果不加到 INSTALL_APPS 中的话, django 就不能自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件)

2.定义视图函数(即访问页面时显示的内容)

打开/zebk下的views.py文件 增加以下内容

# -*- coding: utf-8 -*- 
from django.http import HttpResponse
 
def index(request):
    return HttpResponse(u"hellow 中二病控丶!")
  1. 第一行是声明编码为utf-8, 因为我们在代码中用到了中文,如果不声明就报错.
  2. 第二行引入HttpResponse,它是用来向网页返回内容的,就像Python中的 print 一样,只不过 HttpResponse 是把内容显示到网页上。
  3. 我们定义了一个index()函数,第一个参数必须是 request,与网页发来的请求有关,request 变量里面包含get或post的内容,用户浏览器,系统等信息在里面(后面会讲,先了解一下就可以)。
  4. 函数返回了一个 HttpResponse 对象,可以经过一些处理,最终显示几个字到网页上。

3. 定义视图函数函数相关的URL

  1. 定义视图函数相关的URL(网址) (即规定 访问什么网址对应什么内容)
    打开 mysite/mysite/urls.py 这个文件, 修改其中的代码:
    在mysite/urls.py,导入django.conf.urls.include模块,并且添加到urlpatterns列表,所以mysite/urls.py如下:
# mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^zhong/', include('zhong.urls')),
    url(r'^admin/', admin.site.urls),
]

2.在zhong中创建urls.py,编写如下:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

然后在终端上运行 python manage.py runserver 我们会看到类似下面的信息:

 python manage.py runserver
 
Performing system checks...
 
System check identified no issues (0 silenced).
 
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
 
December 22, 2015 - 11:57:33
Django version 1.9, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

打开网页,输入127.0.0.1:8000/zhong/

8.管理操作

  • 站点分为“内容发布”和“公共访问”两部分
  • “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。为此,Django会根据定义的模型类完全自动地生成管理模块

使用django的管理

创建一个管理员用户

python manage.py createsuperuser,按提示输入用户名、邮箱、密码
  • 启动服务器,通过“127.0.0.1:8000/admin”访问,输入上面创建的用户名、密码完成登录
  • 进入管理站点,默认可以对groups、users进行管理

管理界面本地化

  • 编辑settings.py文件,设置编码、时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

向admin注册booktest的模型

  • 打开booktest/admin.py文件,注册模型
from django.contrib import admin
from models import BookInfo
admin.site.register(BookInfo)
  • 刷新管理页面,可以对BookInfo的数据进行增删改查操作
  • 问题:如果在str方法中返回中文,在修改和添加时会报ascii的错误
  • 解决:在str()方法中,将字符串末尾添加“.encode('utf-8')”

自定义管理页面

  • Django提供了admin.ModelAdmin类
  • 通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式
class QuestionAdmin(admin.ModelAdmin):
    ...
admin.site.register(Question, QuestionAdmin)
列表页属性
  • list_display:显示字段,可以点击列头进行排序
list_display = ['pk', 'btitle', 'bpub_date']
  • list_filter:过滤字段,过滤框会出现在右侧
list_filter = ['btitle']
  • search_fields:搜索字段,搜索框会出现在上侧
search_fields = ['btitle']
  • list_per_page:分页,分页框会出现在下侧
list_per_page = 10
添加、修改页属性
  • fields:属性的先后顺序
fields = ['bpub_date', 'btitle']
  • fieldsets:属性分组
fieldsets = [
    ('basic',{'fields': ['btitle']}),
    ('more', {'fields': ['bpub_date']}),
]
关联对象
  • 对于HeroInfo模型类,有两种注册方式

    • 方式一:与BookInfo模型类相同
    • 方式二:关联注册
  • 按照BookInfor的注册方式完成HeroInfo的注册

  • 接下来实现关联注册

from django.contrib import admin
from models import BookInfo,HeroInfo

class HeroInfoInline(admin.StackedInline):
    model = HeroInfo
    extra = 2

class BookInfoAdmin(admin.ModelAdmin):
    inlines = [HeroInfoInline]

admin.site.register(BookInfo, BookInfoAdmin)
  • 可以将内嵌的方式改为表格
class HeroInfoInline(admin.TabularInline)
布尔值的显示
  • 发布性别的显示不是一个直观的结果,可以使用方法进行封装
def gender(self):
    if self.hgender:
        return '男'
    else:
        return '女'
gender.short_description = '性别'
在admin注册中使用gender代替hgender
class HeroInfoAdmin(admin.ModelAdmin):
    list_display = ['id', 'hname', 'gender', 'hcontent']

2018.5.15 更新

了解了下Django的社交用户系统的包 django-allauth,django-allauth是集成了local用户系统和social用户系统,其social用户系统可以挂载多个账户。也是一个流行度非常高的Django user系统。

  • 安装
pip install django-allauth
  • 配置
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
#"django.contrib.messages.context_processors.messages"
# Required by allauth template tags
"django.core.context_processors.request",
# allauth specific context processors
"allauth.account.context_processors.account",
"allauth.socialaccount.context_processors.socialaccount",
)

AUTHENTICATION_BACKENDS = (
# Needed to login by username in Django admin, regardless of `allauth`
"django.contrib.auth.backends.ModelBackend",

# `allauth` specific authentication methods, such as login by e-mail
"allauth.account.auth_backends.AuthenticationBackend",
)

INSTALLED_APPS = (
...
# The Django sites framework is required
'django.contrib.sites',

'allauth',
'allauth.account',
'allauth.socialaccount',
# ... include the providers you want to enable:
'allauth.socialaccount.providers.amazon',
'allauth.socialaccount.providers.angellist',
'allauth.socialaccount.providers.bitbucket',
'allauth.socialaccount.providers.bitly',
'allauth.socialaccount.providers.coinbase',
'allauth.socialaccount.providers.dropbox',
'allauth.socialaccount.providers.facebook',
'allauth.socialaccount.providers.flickr',
'allauth.socialaccount.providers.feedly',
'allauth.socialaccount.providers.github',
'allauth.socialaccount.providers.google',
'allauth.socialaccount.providers.hubic',
'allauth.socialaccount.providers.instagram',
'allauth.socialaccount.providers.linkedin',
'allauth.socialaccount.providers.linkedin_oauth2',
'allauth.socialaccount.providers.openid',
'allauth.socialaccount.providers.persona',
'allauth.socialaccount.providers.soundcloud',
'allauth.socialaccount.providers.stackexchange',
'allauth.socialaccount.providers.tumblr',
'allauth.socialaccount.providers.twitch',
'allauth.socialaccount.providers.twitter',
'allauth.socialaccount.providers.vimeo',
'allauth.socialaccount.providers.vk',
'allauth.socialaccount.providers.weibo',
'allauth.socialaccount.providers.xing',
...
)
  • urls.py
urlpatterns = patterns('',
...
(r'^accounts/', include('allauth.urls')),
...
)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容