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/ 了

posted @ 2017-01-09 20:18  zhangshihai1232  阅读(105)  评论(0)    收藏  举报