zoukankan      html  css  js  c++  java
  • Hello World 之Django(上)

    fPS:此文基本翻译自django官网的一个tutorial。

    Django是用Python编写的一个Web开发框架,在开始使用之前,先要安装好Python,并且配置好Path环境变量,将python的可执行程序所在目录加进去。然后去Django下载页面下载最新的Django代码,解压到合适的目录。用命令行进入目录后,执行

    E:\ProjectMy\Python\Django-1.2.5>python setup.py install

    执行完毕之后,再把类似

    C:\Python27\Lib\site-packages\django\bin

    的路径加入Path环境变量中。

    接下来执行 django-admin.py startproject mysite 命令,这会在当前目录下创建一个mysite目录,并且创建几个基本的文件。

    此时一个基本的网站已经搭建好了,可以利用如下命令查看下:

    E:\ProjectMy\Python\mysite>python manage.py runserver
    Validating models...
    0 errors found

    Django version 1.2.5, using settings 'mysite.settings'
    Development server is running at http://127.0.0.1:8000/
    Quit the server with CTRL-BREAK.
    [19/Mar/2011 17:06:49] "GET / HTTP/1.1" 200 2051

    下面开始配置下数据库,打开settings.py文件,按照注释的提示,修改DATABASES为:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': 'mysite.db',                      # Or path to database file if using sqlite3.
            'USER': '',                      # Not used with sqlite3.
            'PASSWORD': '',                  # Not used with sqlite3.
            'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
            'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
        }
    }

    这样就配置好了数据库。sqlite的数据库文件如果不存在,它会自动创建。使用如下命令 python manage.py syncdb 来同步数据库。此时我们并没有写任何东西,注意settings文件的底部,INSTALLED_APPS,在syncdb的时候会检查这些模块是否需要同步数据库,所以此时,同步的是这些模块的数据库表。命令执行完之后可以看到在指定的目录下新生成了一个sqlite的数据库文件,用SQLLiteExpert查看下,可以看到生成了一些数据库表。

    一个django的项目是由很多个app组成的,通过INSTALLED_APPS来连接起来,下面来创建一个自己写的app。输入命令 python manage.py startapp polls,会生成一个文件夹polls,里面有三个基本的文件

    models.py,views.py,test.py

    其中models就是用来编写业务对象的地方,业务对象包括一些字段和其他的一些信息,django可以根据这些信息来创建数据库表,减少编程人员的工作量。业务对象是用继承自django.db.models.Model的python类来表示的,例如:

    from django.db import models
    
    # Create your models here.
    class Poll(models.Model):
        question=models.CharField(max_length=200)
        pub_date=models.DateTimeField('date published')
        
    class Choice(models.Model):
        poll=models.ForeignKey(Poll)
        choice=models.CharField(max_length=200)
        votes=models.IntegerField()

    注: 我编写python的IDE是Komodo Edit, 效果还不错,有自动提示。

    创建好了model文件之后,我们需要做两件事,创建对应于model的数据库表,已经创建Data Access类。在django中这些工作是非常容易的。首先,我们需要在settings文件中注册下我们的app:

    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'polls'
    )

    这样mysite项目就知道有polls这个app了,执行下面的命令就可以生成对应的sql:
    E:\ProjectMy\Python\mysite>python manage.py sql polls
    BEGIN;
    CREATE TABLE "polls_poll" (
        "id" integer NOT NULL PRIMARY KEY,
        "question" varchar(200) NOT NULL,
        "pub_date" datetime NOT NULL
    )
    ;
    CREATE TABLE "polls_choice" (
        "id" integer NOT NULL PRIMARY KEY,
        "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
        "choice" varchar(200) NOT NULL,
        "votes" integer NOT NULL
    )
    ;
    COMMIT;

    运行这个命令只是为了了解下django到底做了些什么,实际上,只要用syncdb命令就可以了。
    E:\ProjectMy\Python\mysite>python manage.py syncdb
    Creating table polls_poll
    Creating table polls_choice
    Installing index for polls.Choice model
    No fixtures found.

    进入SQLiteExpert查看下,可以确认数据库表已经创建好。下面可以测试下生成的Data Access API,可以在python的交互窗口中试验下API而无需单独编写代码。利用python manage.py shell命令进入交互窗口,然后可以如下测试下API:


    E:\ProjectMy\Python\mysite>python manage.py shell
    Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from polls.models import Poll,Choice
    >>> Poll.objects.all()
    []
    >>> import datetime
    >>> p=Poll(question="What's up?",pub_date=datetime.datetime.now())
    >>> p.save()
    >>> p.id
    1
    >>> Poll.objects.all()
    [<Poll: Poll object>]
    首先查看下所有的Poll,一开始是什么也没有,接着创建了一个Poll对象,然后调用它的save方法,保存到数据库,并且可以看到生成的ID是1。 我们去数据库中看看:
    E:\ProjectMy\Python\mysite>sqlite3 mysite.db
    sqlite> select * from polls_poll;
    1|What's up?|2011-03-19 20:28:55.207000

    可以看到数据已经成功保存到数据库中。不过最后的显示显示成Poll object没什么意义,我们要为Poll类编写一个序列化方法,当然还可以添加一些其他方法,例如:

        def __unicode__(self):
            return self.question
        def was_published_today(self):
            return self.pub_date.date() == datetime.date.today()
    退出交互窗口之后重新进入,可以尝试更多的方法:

    >>> from polls.models import Poll
    >>> Poll.objects.all()
    [<Poll: What's up?>]
    >>> Poll.objects.filter(id=1)
    [<Poll: What's up?>]
    >>> Poll.objects.filter(question__startswith="What")
    [<Poll: What's up?>]
    >>> p=Poll.objects.get(pk=1)
    >>> p.was_published_today()
    True

    下面我们关注下django自带的网站后台管理系统。首先,在settings.py中的INSTALLED_APPS中启用django.contrib.admin模块,然后在urls.py中配置url地址,按照注释去掉三行被注释掉的代码即可:

    from django.contrib import admin
    admin.autodiscover()
    
    urlpatterns = patterns('',
        (r'^admin/', include(admin.site.urls)),
    )

    这样就可以用python manage.py runserver 来启动服务器,再到127.0.0.1:8000/admin去查看,可以看到一个基本的后台管理系统。增删改的功能都具备。但是刚才新增的poll app并没有显示出来,我们需要在polls目录下新建一个admin.py,代码如下:

    from polls.models import Poll
    from django.contrib import admin
    admin.site.register(Poll)

    这样再重启下服务器就能看到Poll的基本管理功能:

    捕获

    新增:

    捕获

    除此以外,还能自定义下表单的格式,例如将admin.py的代码改成如下:

    class PollAdmin(admin.ModelAdmin):
        fields=['pub_date','question']
    admin.site.register(Poll,PollAdmin)

    刷新下页面,就可以看见Date published框排到了上面。

    下面来处理一对多关系,每一个Poll有多个Choices。有两种方法来实现这一点,第一种很简单,和Polls一样,只需要两行代码就可以加入Choice的管理功能:

    from polls.models import Choice
    admin.site.register(Choice)

    保存文件之后,运行服务器进入admin页面,可以看见Choice管理功能已经加入,点击Add,可以看到Choice编辑页面如图:

    捕获

    注意到Poll被自动表示为一个select,这是因为在model中指定了Poll是外键。当然,这样为一个Poll添加多个Choice是很麻烦的,最好是在创建Poll的时候就把Choice添加上去。 把刚才的代码替换成:

    class ChoiceInline(admin.StackedInline):
        model=Choice
        extra=3
    
    class PollAdmin(admin.ModelAdmin):
        fields=['pub_date','question']
        inlines=[ChoiceInline]
    admin.site.register(Poll,PollAdmin)

    保存后刷新页面,可以看到Polls的编辑界面变成了如下:

    捕获

    现在Polls的list列表显示的是之前的model文件中Poll的__unicode__方法的返回值,也可以配置成显示某些字段,只需把下面这行代码加入PollAdmin类中:

    list_display = ('question', 'pub_date','was_published_today')

    Polls的list页面就变成了:

    捕获

    至此,一个基本的后台就完成了。

  • 相关阅读:
    Python将文本生成二维码
    Python 发送邮件
    北京地铁月度消费总金额计算(Python版)
    将w3cplus网站中的文章页面提取并导出为pdf文档
    [开发笔记]-MarkDown语法
    linux多版本php安装+采坑指南
    浏览器跨域暴力解决
    php7使用xhprof测试php性能
    vscode使用xdebug断点调试php代码(无论win还是linux)
    ghostscript之pdf处理
  • 原文地址:https://www.cnblogs.com/yinzixin/p/2000330.html
Copyright © 2011-2022 走看看