码迷,mamicode.com
首页 > 其他好文 > 详细

django官方文档1.6学习笔记-编写你的第一个django程序

时间:2015-04-14 20:25:51      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

运行环境  centos6.5  django1.6 python2.7.8

python -c "import django;print djang.get_version()" or django.VERSION

  1. 创建django项目:

    django-admin.py startproject mysite

    目录结构如下:

    mysite/                             ###这个名字对django命名成什么都没关系。

          manage.py                     ###操作你项目的命令行工具

          myite/                        ###真正的django项目包,需要这个名字导入里面的内容

               __init__.py              ###把这个包变成一个朋友谈话哦能包

               settings.py              ###本django项目的配置相关

               urls.py                  ###本django项目的url声明

               wsgi.py                  ###于wsgi项匹配的WEB服务器的切入点

  2. 开发服务器的使用(默认是8000端口)

    python manage.py runserver 8080

    python manage.py runserver 0.0.0.0:8080

  3. 数据库设置:

    在settings.py中进行设置,django默认自带sqlite数据库

    python manage.py syncdb 创建数据库中不存在的数据库表,因为django自带一些app,需要创建完项目后创建这些表

  4. prijects和app的区别是什么?

    app是做什么的网络应用

    project是一个web站点中很多app和配置的集合

    一个app可以被很多个项目包含

    一个project可以包含很多个app

  5. 创建django app

    pyrhon manage,py startapp polls

    目录如下:

        polls/

            __init__.py

            admin.py

            models.py

            tests.py

            views.py

  6. 编辑app实体类models.py(app开发第一步...面向对象的语言的第一步估计都是吧)

    from django.db import models

    class Poll(models.Model):

        question = models.CharField(max_length=200)

        pub_date = models.DateTimeField("date published")

        def was_published_recently(self):

            return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

        #使用unicode,因为django的实体类默认使用unicode在python2.7.8中

        def __unicode__(self):

            return self.question

    class Choice(models.Model):

        poll = models.ForeignKey(Poll)

        choice_text = models.CharField(max_length=200)

        votes = models.IntegerField(default=0)

        def __unicode__(self):

            return self.choice_text

  7. 安装app,因为django的app是即插即用的,所以,你可以在多个项目中使用一个app,你也可以发布apps,因为因为他们不是必须进行给定的安装。

    在settings.py中安装app

    INSTALLED_APPS=(

    ‘polls‘,

    )

  8. 显示将要打印的sql语句(并不执行sql语句) python manage.py sql polls

    python manage.py syncdb

  9. python manage.py shell进入python shell,对实体类进行相关的数据库操作

  10. http://localhost:8000/admin/ 进入admin app

    admin.site.register(Poll) 告诉admin Poll这个实体类类有一个admin接口

  11. class PollAdmin(admin.ModelAdmin)

        fields = [‘pub_date‘,‘question‘]#对admin的前台进行重新排序

    admin.site.register(Poll,PollAdmin)

  12. class PollAdmin(admin.ModelAdmin):

        fieldsets = [#将实体类前台form的元素是否放在一个field标签中

            (None, {‘fields‘:[‘question‘]}),#第一个元素是名称,第二个元素是实体类名

            (‘Date information‘,{‘fields‘:[‘pub_date‘],‘classes‘:[‘collapse‘]}),#collaps:fieldset是否下拉隐藏

        ]

    admin.site.register(Poll,PollAdmin)

  13. class ChiceInline(admin.StackedInline):#admin.TabularInlin,更紧凑的添加方式

        model = choice

        extra = 3 #在创建Poll的时候,创建3个choice的选项,自动关联外键

    class PollAdmin(admin.ModelAdmin):

        fieldsets = [

            (None,{‘fields‘:[‘question‘]}),

            (‘Date information‘,{‘fields‘:[‘pub_date‘],‘classes‘:[‘collapse‘]}),

        ]

        inlines = [ChoiceInline]

    admin.site.register(Poll,PollAdmin)

    #在页面的最后, + Add anthon Choice

  14. 展示属性:

    class PollAdmin(admin.ModelAdmin):

        list_display = (‘question‘,‘pub_date‘)#将实体类中的两个属性进行展示

  15. 展示属性和方法

    class PollAdmin(admin.ModelAdmin):

        list_display = (‘question‘,‘pub_date‘,‘was_published_recently‘)#展示两个属性和实体类中一个方法的值

  16. 添加filter change list page

    class PollAdmin(admin.ModelAdmin):

        list_filter = [‘pubdate‘]

  17. 添加模糊查询

    class PollAdmin(modelsAdmin):

        search_fields = [‘question‘]#按此字段进行查询村,可添加多个,数据库查询使用like

  18. 个性化你的项目模板

    在项目目录下创建/template,templat

    /mysite/settings.py 并且打开template_dirs setting:

    TEMPLATE_DIRS = [os.path.join(BASE_DIR,‘templates‘)]

  19. 修改 app admin的模板

    在templates这个文件夹下,创建admin文件夹,拷贝django源码的admin/base_site.html到该文件夹下

    然后寻找到自己要修改的内容进行修改。

  20. 如果你寻找不到django在你机器上的源码,请运行以下的命令:

    python -c "import sys;sys.path=sys.path[1:];import django;print(django.__path__)"

  21. 所有的admin模板都能被覆盖,就像覆盖base_site.html一样,把他们从源码包中拷进你自己的目录中,并做修改

  22. 个性化admin index page:略

  23. django是怎么找到它的tempaltes的?

    django可以从很多地方寻找模板文件,依赖你的tempalte-loader设置,但是最基本的方式是使用TEMPLATE_DIRS设置

    TEMPALTE_DIRS = (

    "/home/html/templates/lawrence.com",

    "/home/html/templates/default",

    )

    你的模板文件可以放到你想要的任何地方,只要你的web服务器能读到他们。可以使用任何的后缀.txt .html,或者没有扩展名。注意这些路径需要使用linux风格的正斜杠,即使是在windows下

    djago.template.loader有两个函数从文件中加载模板:

        1,get_template(template_name):返回一个名字为给定名字的已经编译的template(a Template object),如果不存在,则raises django.template.TemplateDoesNotExist

        2,select_template(template_name_list):和get_template()一样,只不过使用一个template名字列表,在这个列表中,它返回第一个存在的template。

        按照TEMPLATE_DIRS的配置的路径顺序查找文件,如果查找到一个存在的template,则停止查找。

    使用子目录:

    最好是以子目录的方式在template目录中组织你的模板。习惯是一个app一个子目录

    加载一个模板从子目录中,仅仅使用简写就可以,像这样:

    get_tempalte(‘news/story_detail.html‘)

    结合你上面TEMPLATE_DIRS配置,则可能会加载下面的模板:

    /home/html/templates/lawrence.com/news/story_detail.html

    /home/html/templates/default/news/story_detail.html

  24. 加载器的类型:

    默认情况下,django使用基于文件的模板加载器,但是django还有其他知道怎么从其他资源中加载模板的一些加载器

    其中的一些默认环境下是失效的,你可以通过设置TEMPLATE_LOADERS使他们生效,TEMPALTE_LOADERS应该是字符串的元组,每一个字符串代表一个模板加载器类,下面是django自带的模板加载器:

    django.template.loaders.filesystem.Loader

    class filesystem.Loader

        从文件系统加载模板,根据TEMPLATE_DIRS的配置。默认有效。

    django.template.loaders.app_directories.Loader

    class app_directories.Loader

        从文件系统上加载django apps的模板。对每一个INSTALLED_APPS中安装的app,本加载器查找一个模板的子目录

        ,如果目录存在,django将在此目录中寻找模板。

    例如:

    INSTALLED_APPS = (‘myject.polls‘,‘myject.music‘)

    然后get_template(‘foo.html‘),将会在下面的文件夹以下面的顺序进行查找:

    /path/to/myproject/polls/templates/

    /path/to/myproject/music/templates/

    并且使用查找到的第一个找到的模板。

    INSTALLED_APPS中安装的app的顺序很关键,如果你想在myproject.polls个性化django admin使用你自己的admin/base_site.html,你必须的保证你的myprojrct.polls的顺序在django.contrib.admin之前。

    此加载器在第一次被引入的时候被优化,它缓存了一个列表哪个INSTALLED_APPS包有模板子目录。

    默认此此加载器有效。

    django.template.loaders.eggs.Loader

    class eggs.Loader

        很像app_directories模板加载器,但是此加载器从python eggs中加载而不是文件系统。

    默认此加载器无效。

    django.template.loaders.cached.Loafer

    class cached.Loader

        默认情况下,模板系统将会在在模板需要渲染的时候读取并编译他们,尽管django的模板系统非常快,读和编译模板的开销也会增加。

    缓存加载器是一种基于类的加载器,你配置了一列其他加载器时,此加载器应该被覆盖。包装的加载器被用来定位一次遇到的未知的模板。缓存加载器会记住这个编译的模板。缓存的模板被返回,当随后的请求要求加载相同模板时。(翻译的可能有问题)

    The cached template loader is a class-based loader that you configure with a list of other loaders that it should wrap. The wrapped loaders are used to locate unknown templates when they are first encountered. The cached loader then stores the compiled Template in memory. The cached Templateinstance is returned for subsequent requests to load the same template.

    比如:

    TEMPLATE_LOADERS=(

        (‘django.template.loaders.cached.Loader‘,(

        django.template.loaders.filesysytem.Loader‘‘,

        ‘django.template.loaders.app_directories.Loader‘,

        )),

    )

    缓存加载器默认无效

    django按TEMPLATE_LOADERS设置顺序使用模板加载器,他使用每种加载器知道找到一个匹配项。

  25. 在django中,网页和其他的内容被试图发送,一个试图被一个简单的python函数或者方法代表,django通过检查请求的url选择一个试图进行处理。

    你上网的时候可能遇到过一些类似的url“ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B”,你将会为django拥有比那更优雅的url感到欣慰。

    为了让一个url匹配到视图,django使用‘urlconfs’,一个urlconf匹配urlpatterns到视图

    from django.http import HttpResponse

    def index(request):

        return HttpResponse("Hello,world.You are at the poll index")

    在django中,这可能最简单的视图。想要访问视图,我们需要把它和URL进行匹配,我们需要URLconf

    创建一个URLconf在polls目录,我创建一个文件命名为urls.py.你的app目录应该看上去像这样:

    polls/

        __init__.py

        admin.py

        models.py

        tests.py

        urls.py

        views.py

    在polls/url.py文件包含以下的代码:

    from django.conf.urls import patterns,url

    from polls import views

    urlpatterns = patterns(‘‘,

        url(r‘^$‘,views.index,name=‘index‘)

    下一个步骤是在root URLconf指向polls.urls模块。在mysite/urls.py中插入一个include()

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

    from django.contrib import admin

    admin.autodiscover()

    urlpatterns = patterns(‘‘,

        url(r‘^polls/‘,include(‘polls.urls‘)),

        url(r‘^admin/‘,include(admin.site.urls)),

    )

    现在,你已经连接index视图到URLconf,在你浏览器上运行http://localhost:8000/polls/,你将看到:

    Hello, world. You’re at the poll index.

    url()函数有四个参数,两个是必须的(regex view),两个是可选的(kwargs,name),这一点上,值得回顾下这些参数的作用:

    regex:正则表达式,用来匹配字符串格式的语法。django从第一个正则表达式开始,比对请求的URL,知道匹配成功

        注意:正则表达式不会匹配GET和POST的参数或者域名。

        实际上,你不许要精通正则表达式,因为你仅仅需要知道简单的格式。事实上,复杂的正则表达式可能有差的查找性能。所以你用不到正则表达式的全部功能。

        最后,一个性能提示:这些正则表达式在URLconf模块第一次被加载的时候被编译。

    view:当django找到匹配的正则表达式,会访问对应的视图函数,该视图函数会以HttpRequest作为第一个参数和任何从正则表达式捕获的作为其他参数。如果正则表达式使用simple captures,值将被传递作为位置参数,如果使用命名的captures,值被传递为关键字参数。

    kwargs:随意的关键字参数可以在关键字中被传递给目标视图,在本教程中我们不会使用django的这个特性

    name:命名你的url,让你在别的地方尤其是在模板中可以明确的的参考它。这个强大的特征允许你进行全局更改到项目的urlpatterns,当你仅仅只能修改一个文件的时候。

  26. 往polls/views.py中添加更多的视图

    def detail(request,poll_id):

        return HttpResponse(‘You are looking at poll %s‘ % poll_id)

    def results(request,poll_id):

        return HttpResponse(‘You are looking at the results of poll %s‘ % poll_id)

    def vote(request,poll_id):

        return HttpResponse("you are voting on poll %s" % poll_id)

    往polls.urls.py文件中添加新的视图

    from django.conf.urls import patterns,url

    from polls import views

    urlpatterns = patterns(‘‘,

    #ex:/poll/

    url(r‘^$‘,views.index,name="index"),

    #ex:/poll/5/

    url(r‘^(?P<poll_id>\d+)/$‘,views.detail,name=‘detail‘),

    #ex: /polls/5/reults/

    url(r‘^(?p<poll_id>\d)/reults/$‘,views.results,name="results")

    $ex:/polls/5/vote/

    url(r‘^(?P<poll_id>\d+)/vote/$‘,views.vote,name="vote"),

    )

   


   






django官方文档1.6学习笔记-编写你的第一个django程序

标签:

原文地址:http://my.oschina.net/u/2322561/blog/401492

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!