django-基础-搭建&命令&视图url&name
Django 全貌
urls.py 网址入口,关联views.py中的一个函数
views.py 从urls.py中对应过来,处理用户请求,渲染templates可以显示内容
models.py 数据库操作
forms.py 表单操作
admin.py 后台
settings.py 配置文件
安装bpython
搭建、命令
1.新建django项目
django-admin.py startproject project-name
2.新建 app
进入项目目录中
python manage.py startapp app-name #或django-admin.py startapp app-name
一般一个项目有多个app, 当然通用的app也可以在多个项目中使用。
3.同步数据库
#旧命令
python manage.py syncdb
#注意:Django 1.7.1及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
这种方法可以创建表,当你在models.py中新增了类时,运行它就可以自动在数据库中创建表了,不用手动创建。
备注:对已有的 models 进行修改,Django 1.7之前的版本的Django都是无法自动更改表结构的,不过有第三方工具 south,详见 Django 数据库迁移 一节。
4.使用开发服务器
开发服务器,即开发时使用,一般修改代码后会自动重启,方便调试和开发,但是由于性能问题,建议只用来测试,不要用在生产环境。
python manage.py runserver
# 当提示端口被占用的时候,可以用其它端口:
python manage.py runserver 8001
python manage.py runserver 9999
(当然也可以kill掉占用端口的进程)
# 监听所有可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址)
python manage.py runserver 0.0.0.0:8000
# 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器
# 访问对应的 ip加端口,比如 http://172.16.20.2:8000
5.清空数据库
python manage.py flush
此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。
6.创建超级管理员
python manage.py createsuperuser
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
# 修改 用户密码可以用:
python manage.py changepassword username
7.导出数据 导入数据
python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json
8.Django 项目环境终端
python manage.py shell
如果你安装了 bpython 或 ipython 会自动用它们的界面,推荐安装 bpython。
这个命令和 直接运行 python 或 bpython 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。
9.数据库命令行
python manage.py dbshell
Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。
在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。
10.更多命令
终端上输入 python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。
Django 视图与网址
网址写在urls.py,用正在表达式对应 views.py中的一个函数或者generic类
先创建一个项目project
django-admin startproject mysite
如果成功,会看到工程
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
新建一个app
python manage.py startapp learn # learn 是一个app的名称
learn文件夹如下
learn/
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.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',
'learn',
)
新建的 app 如果不加到 INSTALL_APPS 中的话, django 就不能自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件)
定义视图函数(访问页面时的内容)
/lean/views.py打开,修改代码,改成如下
#coding:utf-8
from django.http import HttpResponse
def index(request):
return HttpResponse(u"欢迎光临 自强学堂!")
第一行是声明编码为utf-8, 因为我们在代码中用到了中文,如果不声明就报错.
第二行引入HttpResponse,它是用来向网页返回内容的,就像Python中的 print 一样,只不过 HttpResponse 是把内容显示到网页上。
我们定义了一个index()函数,第一个参数必须是 request,与网页发来的请求有关,request 变量里面包含get或post的内容,用户浏览器,系统等信息在里面(后面会讲,先了解一下就可以)。
函数返回了一个 HttpResponse 对象,可以经过一些处理,最终显示几个字到网页上。
定义视图函数相关的URL
打开mysite/mysite/urls.py
文件
1.8以上,上面一定要引入app的view文件
from django.conf.urls import url
from django.contrib import admin
from learn import views as learn_views # new
urlpatterns = [
url(r'^$', learn_views.index), # new
url(r'^admin/', admin.site.urls),
]
运行
python manage.py runserver 0.0.0.0:8000
urls.py使用的正则表达式
Django 视图与网址进阶
在网页上做加减法
使用 /add/?a=4&b=5
这样的get方法
django-admin.py startproject zqxt_views
cd zqxt_views
python manage.py startapp calc
构建的目录如下
zqxt_views/
├── calc
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── zqxt_views
├── __init__.py
├── __init__.pyc
├── settings.py
├── settings.pyc
├── urls.py
└── wsgi.py
修改calc/views.py
文件
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse
def add(request):
a = request.GET['a']
b = request.GET['b']
c = int(a)+int(b)
return HttpResponse(str(c))
注:request.GET 类似于一个字典,更好的办法是用 request.GET.get('a', 0) 当没有传递 a 的时候默认 a 为 0
修改zqxt_views/urls.py
文件,添加一个网址来对应我们刚才新建的视图函数。
from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views
urlpatterns = [
url(r'^add/$', calc_views.add, name='add'), # 注意修改了这一行
url(r'^admin/', admin.site.urls),
]
采用 /add/3/4/ 这样的网址的方式
修改calc/views.py,定义add2函数
def add2(request, a, b):
c = int(a) + int(b)
return HttpResponse(str(c))
Django URL name详解
打开zqxt_views/urls.py
from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views
urlpatterns = [
url(r'^add/$', calc_views.add, name='add'),
url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
url(r'^admin/', admin.site.urls),
]
url(r'^add/$', calc_views.add, name='add')
, 这里的 name='add'
是用来干什么的呢?
修改 calc/views.py
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return render(request, 'home.html')
...此处省去一些代码
render 是渲染模板,不懂先照着打就好。
将 'calc' 这个 app 加入到 zqxt_views/settings.py 中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'calc',
]
这样,使用render的时候,Django 会自动找到 INSTALLED_APPS 中列出的各个 app 下的 templates 中的文件。
DEBUG=True 的时候,Django 还可以自动找到 各 app 下 static 文件夹中的静态文件(js,css,图片等资源)
我们在 calc 这个 app 中新建一个 templates 文件夹,在templates中新建一个 home.html
<!DOCTYPE html>
<html>
<head>
<title>自强学堂</title>
</head>
<body>
<a href="/add/4/5/">计算 4+5</a>
</body>
</html>
修改 zqxt_views/urls.py
...此处省去一些代码
urlpatterns = [
url(r'^$', calc_views.index, name='home'),
url(r'^add/$', calc_views.add, name='add'),
url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
url(r'^admin/', admin.site.urls),
]
此时访问服务器就可以看到
但是这里是在网页中写死了,访问http://192.168.253.225:8000/add/4/5/
<a href="/add/4/5/">计算 4+5</a>
这样我们修改了 urls.py、模板、跳转、models.py很多地方,代价很大
如何解决呢?
使用python获取对应的网址
reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。
在网页模板中也是一样,可以很方便的使用。
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
上面的代码渲染成最终的页面是
<a href="/add/4/5/">link</a>
这样就可以通过 {% url 'add2' 4 5 %} 获取到对应的网址 /add/4/5/
当 urls.py 进行更改,前提是不改 name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
注意看重点 add 变成了 new_add,但是后面的 name='add2' 没改,这时 {% url 'add2' 4 5 %} 就会渲染对应的网址成 /new_add/4/5/
reverse 函数也是一样,获取的时候会跟着变成新的网址,这样,在想改网址时只需要改 urls.py 中的正则表达式(url 参数第一部分),其它地方都“自动”跟着变了,是不是这样更好呢?
views.py写一个跳转函数
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def old_add2_redirect(request, a, b):
return HttpResponseRedirect(
reverse('add2', args=(a, b))
)
urls.py中
url(r'^add/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
假如用户收藏夹中有 /add/4/5/ ,访问时就会自动跳转到新的 /new_add/4/5/ 了