一、Django 基本命令

温馨提示:如果你想学习Django,那么就请您从现在开始按照笔记记录一步一步的用手把代码敲出来,千万不要偷懒哦。。。。。

1、创建一个Django project

django-admin.py startproject project

或者

django-admin startproject project

一个project为一个项目,后面project是项目名称,根据自己的需求可以自己自定义修改,必须要符合Python的变量命名规则(以下划线或字母开头)

2、新建app

django-admin.py startapp app
或python manage.py startapp app

第一种我自己测试了可以使用第二种,必须在当前文件夹下有一个manage.py文件才可以执行。后面的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 视图与网址

一、先新建一个项目(project),名称为mysite

django-admin startproject mysite
或django-admin.py startproject mysite

注:如果是用Linux源码安装的,或者用pip安装的,也可以用django-admin.py

运行后,如果没有报错的话,可以看到以下目录,如果有错误请查看 Django之路:简介以及环境

root@w:~# tree mysite
mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py 1 directory, 5 files

注:mysite目录中是一些项目的设置settings.py文件,总的urls配置文件urls.py以及部署服务器时用到的wsgi.py文件,__init__.py是python包的目录结构必须的,与调用有关。

在外层的mysite目录下

 二、新建一个应用(app),名称叫learn

root@w:~/mysite# python manage.py startapp learn #learn是一个app的名称

在mysite目录下多了一个learn目录,其中learn下的文件是:

root@w:~/mysite# tree learn/
learn/
├── admin.py
├── __init__.py
├── models.py
├── tests.py
└── views.py 0 directories, 5 files

注: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',
    'learn',    #把learn加到settings.py中
)

注:新键的app如果不加到INSTALL_APPS中的话,django就不能自动找到app中的模版文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件),后面会学到这些文件是用来做什么的。

 二、定义视图函数(访问页面时的内容)

在learn目录中,把views.py打开,修改其中的源代码,改成下面的内容

root@w:~# sudo vi mysite/learn/views.py #目标文件
sudo: 无法解析主机:w #coding:utf-8    #编码声明为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来访问呢?那么就请耐心的继续看下去。

三、定义视图函数相关的URL(网址)(访问什么网址可以返回定义的内容)

我们可以打开 mysite/mysite/urls.py 在这个文件里进行一些修改:

由于Django版本对urls.py进行了一些更改:

Django 1.7.x 及以下的版本看到的内容是这样的:

root@w:~# sudo vi mysite/mysite/urls.py 

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
     url(r'^$', 'learn.views.index'),  #修改后的内容
    # url(r'^blog/', include('blog.urls')),     url(r'^admin/', include(admin.site.urls)),
)

Django 1.8.x及以上,Django官网鼓励(或要求)先引入,在使用:

root@w:~# sudo vi mysite/mysite/urls.py 

from django.conf.urls import patterns, include, url

from django.contrib import admin
from learn import views as learn_views urlpatterns = patterns('',
     url(r'^$', 'learn.views.index'),
    url(r'^admin/', include(admin.site.urls)),
)

以上修改保存后,我们来看以下效果!

在终端上运行python manage.py runserver

root@w:~/mysite# python manage.py runserver
Validating models... 0 errors found
December 23, 2015 - 08:13:51
Django version 1.6.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[23/Dec/2015 08:14:31] "GET / HTTP/1.1" 200 30

注:是在mysite目录下运行的,如果没有出现以外的话在本机上访问http://127.0.0.1:8000就会出现下面的内容:

注意:如果你用的是虚拟机,想在另外一台电脑上访问的话要用python manage.py ip:port格式,比如监听所有IP:

我的虚拟机上的IP是192.168.1.30,以下在本地测试:

root@w:~/mysite# python manage.py runserver 192.168.1.30:8001
Validating models... 0 errors found
December 23, 2015 - 08:21:57
Django version 1.6.10, using settings 'mysite.settings'
Starting development server at http://192.168.1.30:8001/
Quit the server with CONTROL-C.
[23/Dec/2015 08:22:13] "GET / HTTP/1.1" 200 30

访问的页面是:

Django中的urls.py是用正则进行匹配的,如果不熟悉的可以学习以下正则表达式以及Python正则表达式。

三、Django 视图与网址进阶

一、在网页上做加减法

1、采用/add/?a=4&b=8 这样的GET方法进行

root@w:~# django-admin startproject zqxt_views
root@w:~# cd zqxt_views/
root@w:~/zqxt_views# python manage.py startapp calc

自动生成目录大致如下:

root@w:~# tree zqxt_views
zqxt_views
├── calc
│   ├── admin.py
│   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── zqxt_views
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py 2 directories, 12 files

修改以下calc/views.py文件

root@w:~# sudo vi zqxt_views/calc/views.py 

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 ,添加一个网址来对应我们刚才新建的视图函数。

Django 1.7.x 及以下的同学可能看到的是这样的:

root@w:~# sudo vi zqxt_views/zqxt_views/urls.py 

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
    # Examples:
     url(r'^add/$', 'calc.views.add', name='add'),
    # url(r'^blog/', include('blog.urls')),     url(r'^admin/', include(admin.site.urls)),
)

Django 1.8.x 及以上,Django官方鼓励(或要求)先引入,在使用,地版本的Django也可以这样使用:

root@w:~# sudo vi zqxt_views/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),
]

我们打开开发服务器并访问看看

root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
Validating models... 0 errors found
December 23, 2015 - 08:57:30
Django version 1.6.10, using settings 'zqxt_views.settings'
Starting development server at http://192.168.1.30:8001/
Quit the server with CONTROL-C.
[23/Dec/2015 08:57:39] "GET /add/ HTTP/1.1" 500 61882

浏览器打开

这个不能算是错误,因为我们没有传值进去,我们在后面加上?a=3&b=9,即http://192.168.1.30:8001/add/?a=3&b=9就可以看出网页上显示一个12,可以试着改变a和b的值,看看网页上的值是不是a和b的和

 2、采用/add/3/9/这样的网址的方式

我们可以修改文件zqxt_views/calc/views.py,在定义一个函数,可以重新定义,也可以直接修改。这里直接修改。

root@w:~# sudo vi zqxt_views/calc/views.py

from django.shortcuts import render
from django.http import HttpResponse
def add(request, a, b):
        c = int(a)+int(b)
        return HttpResponse(str(c))

接着修改zqxt_views/zqxt_views/urls.py文件中,修改url,如果你是添加的,可以直接修改也可以直接添加。Django 1.7.x 及以下:

root@w:~# sudo vi zqxt_views/zqxt_views/urls.py

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
    # Examples:
     url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
    # url(r'^blog/', include('blog.urls')),     url(r'^admin/', include(admin.site.urls)),
)

Django 1.8.x及以上:

root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
sudo: 无法解析主机:w from django.conf.urls import patterns, include, url from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
    # Examples:
     url(r'^add/(\d+)/(\d+)/$', 'calc_views.views.add', name='add'),
    # url(r'^blog/', include('blog.urls')),     url(r'^admin/', include(admin.site.urls)),
)

我们可以看到网址中多了(\d+),正则表达式中\d代表一个数字,+代表一个或多个前面的字符,写在一起\d+就是一个或多个数字,用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被views.py中的对应视图函数接收。

我在差看以下http://192.168.1.30:8001/add/234/567/,看看是什么效果。

root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
Validating models... 0 errors found
December 23, 2015 - 09:17:00
Django version 1.6.10, using settings 'zqxt_views.settings'
Starting development server at http://192.168.1.30:8001/
Quit the server with CONTROL-C.
[23/Dec/2015 09:17:03] "GET /add/234/567/ HTTP/1.1" 200 3

浏览器访问:

二、url中的name【技能提升】

在看以下urls.py中的代码

root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
sudo: 无法解析主机:w from django.conf.urls import patterns, include, url from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
    # Examples:
     url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
    # url(r'^blog/', include('blog.urls')),     url(r'^admin/', include(admin.site.urls)),
)
url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),这里的name='add'是做什么用的呢?

在开始的时候想用/add/3/6/,后来需求发生变化,又想改成/2__add__4/这样的格式,但是网页中已经有很多地方已经写死了,就是:

<a href="/add/3/6/">计算 3+6</a>

这样就会出现修改了urls.py后,对应的模版,还有视图用的跳转,以及models.py中也可以能有获取网址的地方。都要修改,这样的话工作量太大了,有时候忘记了也就不好找。

解决以上问题需要在终端上输入

root@w:~/zqxt_views# python manage.py shell
Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.urlresolvers import reverse
>>> reverse('add', args=(3,6))
'/add/3/6/'
>>> reverse('add', args=(333,666))
'/add/333/666/'

reverse接收url中的name作为第一个参数,我们在代码中就可以通过reverse()来获取对应的网址(这个网址可以用来做跳转,也可以用来做计算相关的网址),只要对应的url的name不改,就不用改代码中的网址。

在网页的模版中也一样,可以很方便的使用。

不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
 
例如:
<a href="{% url 'add2' 3 6 %}">link</a>

上面的代码渲染成最终的页面是

<a href="/add/3/6/">link</a>

这样就可以通过{% 'add' 3 6 %} 获取到对应的网址/add/3/6/

当urls.py进行更改,前提是不改name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:

url(r'^new_add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),

注意看重点newadd变成了new_add,这时{% url 'add' 3 6 %}就会渲染对应的网址成/new_add/3/6/,reverse函数也一样会获取新的网址,这样改网址时只需要改urls.py中的正则表达式,其他的地方都“自动”跟着变了。

如何让以前的/add/3/6/自动跳转到新的网址上呢?要知道Django不会帮你做这个,方法如下:

在zqxt_views/calc/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))
    )

在zqxt_views/zqxt_views/urls.py中:

 url(r'^add2/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
    url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

这里的add2就是/add/3/6的配置,这样在输入add/3/6/的时候会自动跳转到/new_add/3/6/了

开始的时候不觉得,用的久了,你会发现“死网址”的方法很糟糕。

Django之路: 基本命令与网址进阶的更多相关文章

  1. Python之路,Day8 - Socket编程进阶

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  2. Django之路

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Django之路(一)——什么是Web开发 Django之路(二)——Django初识 Django之路(三)——U ...

  3. Django:学习笔记(7)——模型进阶

    Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...

  4. Django 视图与网址进阶

    一 .在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 1 2 3 django-admin.py startproject zqxt_views cd zqxt_ ...

  5. 【Django视图与网址进阶004】

    一.在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 django-admin.py startproject zqxt_views cd zqxt_views p ...

  6. Django之路: 模版篇

    一.Django 模版  上章是介绍简单的把django.http.HttpResponse的内容显示到网页上,下面就介绍以下如何使用渲染模版的方法来显示内容.本节代码是基于Django 1.8,但 ...

  7. Django之路:QuerySet API,后台和表单

    一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...

  8. Django之路:模型(数据库)和自定义Field以及数据表的更改

    一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...

  9. Django之路:简介以及环境

     (sudo) pip install Django 或者 (sudo) pip install Django==1.6.10 或者 pip install Django==1.7.6 Windows ...

随机推荐

  1. Slice到C++映射

    按:本文是DPWI第6章的笔记. 客户端Slice到C++映射定义的是:怎样把Slice数据类型翻译成C++类型,客户怎样调用操作.传递参数.处理错误.C++映射线程安全,不存在内存管理问题.不建议查 ...

  2. diff and patch

    A patch captures the changes of two different files (oldfile and newfile). Given the oldfile and the ...

  3. Hadoop YARN ERROR 1/1 local-dirs are bad *, 1/1 log-dirs are bad *

    转 http://blog.csdn.net/u012303571/article/details/46913471   查看 nodemanager 日志发下 如下信息   2015-07-16 1 ...

  4. 还在纠结 Flux 或 Relay,或许 Redux 更适合你

    重磅消息,Redux 1.0 发布,终于可以放心用于生产环境了! 在这个端应用技术膨胀的时代,每天都有一大堆框架冒出,号称解决了 XYZ 等一系列牛 X 的问题,然后过一段时间就不被提起了.但开发的应 ...

  5. Windows系统与Linux系统之间资源samba共享【转】

    配置SAMBA服务器来实现在Windows计算机与Linux计算机之间的用户级的资源共享,九河网络TOM[2694339173]教你怎样操作: SAMBA服务器的基本配置 配置SAMBA服务器来实现在 ...

  6. js获取tr,td内容并排序

    如题 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  7. PHP基本类型操作

    //关键字对大小写不敏感echo ('hello world!<br>');ECho ('hello world<br>');eCho ('hello world<br& ...

  8. Java-Spring MVC如何返回一个非JSP文件名字的地址

    return new ModelAndView("redirect:/bizitem/goEditItem.do?item_id="+item_id+"&msg= ...

  9. oracle提高之索引学习

    一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema ...

  10. 超棒的自定义超酷滚动条jQuery插件 - Perfect Scrollbar

    可能大家厌倦了千篇一律的页面滚动条,如果你希望能够设计出与众不同的页面UI设计的话,Perfect ScrollBar可能就是你寻找的解决方案. 这个滚动条来自于一个个人项目,一个简单但是非常棒的滚动 ...