Django入门-从0开始编写一个投票网站(一)

本人搞iOS的,之前有需求所以学的Python,现在把笔记传上来。
这是我看django的官方入门教程写的笔记,懒得看英文的django0基础的喷油们可以看看。那么开始:

准备

  1. 安装python,或者看看其它博客,这个网上有好多。
  2. 选个编辑工具,之前用的PyCharm,感觉对于新手还挺友好的,去某宝买个码就OK了。现在学着用Atom,因为之前学RN的时候用的,所以也想试试看,atom中文社区里能找找推荐的插件。看自己爱好吧。
  3. 数据库。Python包含了一个SQLite数据库,我用的MySQL,单纯为了学习Django的话可以先跳过。官方特别提到的数据库是PostgreSQLMySQLOracleSQLite
  4. 安装pip。这是python的包管理工具:
    curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python
    sudo easy_install pip
    pip install xxx
    
    tip:如果有问题的话我也忘了怎么解决,因为这部分的笔记没啦啦啦啦。
  5. 安装虚拟环境。虚拟环境就是建立的专属与项目的python环境,这样不会因为项目繁多导致环境里一堆安装包
    $ sudo pip install virtualenv
    $ mkdir /srv/vpython
    $ cd /srv/vpython
    $ virtualenv --no-site-packages 虚拟环境名
    进入虚拟环境:$ source /Users/admin/虚拟环境名/bin/activate
    退出虚拟环境:$ deactivate
    
    进入虚拟环境后,终端会变成这样:(虚拟环境名) MacBook-Pro:目录 用户$
  6. 切换到虚拟环境后,安装Django:
    pip install Django
    
    正式开始

part 1

  • 在虚拟环境下,cd到需要的路径,创建一个名叫mysite的项目。运行:
    Django-admin startproject mysite
    
    用pycharm的话,新建django工程就可以。
    可以看到创建了这样的目录:
    mysite/
       manage.py
       mysite/
          __init__.py
          settings.py
          urls.py
          wsgi.py
    
    如果希望语言使用中文,settings.py里的LANGUAGE_CODE的值改成zh-hans即可。

  • 启动开发用的服务器,后面会另外部署,测试学习的话用这个就行,pycharm直接跑就好了:
    python manage.py runserver
    
    runserver后面可以指定ip和端口,默认127.0.0.1:8000
    此时会看到’You have unapplied migrations’的警告,先不管。

  • 在mysite根目录(即与manage.py同级)下,创建名为polls的应用:
    python manage.py startapp polls
    

  • 编写第一个view,在polls/views.py里:
    from django.http import HttpResponse
    def index(request):
        return HttpResponse("ni hao shi jie")
    

  • 要展示这个view,要映射到url,所以需要一个URLconf(原文这么写的,我也不知道啥意思)。
    在polls目录下,创建一个urls.py文件,在这个文件里:
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^$', views.index, name="index"),
    ]
    

  • 指定polls.urls模块的根URLconf(我的理解是,这个根URLconf会解析路径,然后找到polls.urls,然后再由它找到对应的view),在mysite/urls.py
    from django.conf.urls import include, url
    from django.contrib import admin
    urlpatterns = [
        url(r'^polls/', include('polls.urls')),
        url(r'^admin/', admin.site.urls),
    ]
    
    include()函数用来添加其它的URLconf引用,并且没有$符。
    url()函数有4个参数,2个必选参数,regex,view,2个可选参数:kwargsname

  • 在mysite目录下运行
    python manage.py runserver
    
    用浏览器打开http://127.0.0.1:8000/polls,没看到“ni hao shi jie”的页面算我输。

part 2

  • 创建数据库。在mysite/settings.py文件里修改DATABASE里的字段:
    ENGIN:根据自己的数据库选型,可以改成django.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysqldjango.db.backends.orcle,其它的可以在这里找。
    NAME:数据库的name
    USER:数据库的user
    PASSWORD:对应user的密码
    HOST:本机的话就用‘127.0.0.1’
    PORT:端口

  • 在INTALLED_APPS里定义了所有的django应用,要使用这些应用,要在数据库里建表:
    python manage.py migrate
    

  • 在polls应用里创建2个model,分别是QuestionChoice,以class的形式写在polls/models.py里:
    from django.db import models
    class Question(models.Model):
          question_text = models.CharField(max_length=200)
          pub_date = models.DateTimeField('date published')
    
    class Choice(models.Model):
          question = models.ForeignKey(Question, on_delete=models.CASCADE)
          choice_text = models.CharField(max_length=200)
          votes = models.IntegerField(default=0)
    
    这些model的属性就对应表里的column,值都是Field的子类。例如CharFieldDateTimeField,表示值的类型。
    所有的Filed类,都可以指定一个human-readable的name,这里pub_data指定了,其它的column的名字表意足够清楚可以不用指定。
    有一些Field有必选参数,CharField需要指定max_length
    Field的可以赋值可选参数,例如这里的votes就指定了默认值0
    有关联的话可以设置外键ForeignKey

  • 启动模型。在mysite/settings.pyINSTALLED_APPS添加:
    INSTALLED_APPS = [
          'polls.apps.PollsConfig',
          ...
    ]
    
    这里的PollsConfig类是在polls/apps.py文件里的。

  • 控制台运行:
    python manage.py makemigration polls
    
    成功的话可以看到这么输出:
    Migrations for 'polls':
        polls/migrations/001_initial_py:
            - Create model Choice
            - Create model Question
            - Add field question to choice
    
    makemigration是告诉django你在models上做了手脚,并且你希望保存这些变动。你可以在polls/migrations/001_initial.py里看到你本次的变动。
    可以使用python manage.py sqlmigrate polls 0001来查看0001_initial.py文件本次的sql语句,放心它只是让你看看而已,不会对数据库做这些sql操作。

  • 真正对数据库操作:
    python manage.py migrate
    
    所以综上所述,要对models做更改,需要以下3步:
    1. 在models里修改model
    2. python manage.py makemigrations来为那些更改做migrations
    3. python manage.py migrate 让数据库应用这些更改
    

  • 使用django提供的api做点事情
    打开python的交互shell:
    python manage.py shell
    

    然后终端(我的是mac)会显示这些
    py_shell.png

    看看有多少问题:

    # '>>>' 不是你敲出来的,是shell上本来就有的
    >>> from polls.models import Question, Choice
    >>> Question.objects.all()
    
    创建一个question:
    >>> from django.utils import timezone
    >>> q = Question(question_text="what's up?", pub_date=timezone.now())
    >>> q.save()
    
    查看刚刚创建的question的属性:
    >>> q.id
    >>> q.question_text
    >> q.pub_date
    
    查看所有的question:
    >>> Question.objects.all()
    
    可以看到打印所有的question时,出现了<Question: Question object>这么个玩意儿,并没有什么🐦用,所以我们可以编辑一下模型,增加__str__()(各自参考自己会的其它语言,像OC里就是重写description方法):
    class Question(models.Model):
        ...
        def __str__(self):
            return self.question_text
    
    class Choice(models.Model):
        ...
        def __str__(self):
            return self.choice_text
    
    增加__str__()还是有必要的,不仅方便自己调试,在admin页面也有用哟。
    再来增加一个自定义的方法:
    import datetime
    class Question(models.Model):
        ...
        def was_published_recently(self):
            return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    
    control+z(mac也是control不是cmd)退出shell,然后重新运行python manage.py shell
    查看所有的question时可以看到输出变成<Question: what's up?>
    查看刚刚我们创建的question:
    >>> from polls.models import Question, Choice
    >>> Question.objects.filter(id=1)
    >>> q = Question.objects.get(pk=1)
    >>> q.was_published_recently()
    
    给这个question加上几个选项:
    >>> q.choice_set.create(choice_text="Not much", votes=0)
    >>> q.choice_set.create(choice_text="The Sky", votes=0)
    >>> c = q.choice_set.create(choice_text="Just hacking again", votes=0)
    >>> c.question                       # <Question: what's up?>
    >>> q.choice_set.all()
    >>> q.choice_set.count()      # 3
    

  • 创建管理员用户
    django默认有admin页面,可以对应用作管理。首先创建管理员账号:
    python manage.py createsuperuser
    
    按提示输入用户名,邮箱,密码和确认密码。密码不能太普通(password之流),不能是纯数字,不能跟邮箱类似。
    启动服务器(如果已经启动则不需要重新启动),登录地址:http://127.0.0.1:8000/admin/就能看到admin的登录页,登录登录进去是这样的:
    默认admin.png

  • 注册polls应用。即在admin页面显示polls应用:

    polls/admin.py
    from django.contrib import admin
    from .models import Question
    admin.site.register(Question)
    

    刷新一下页面就可以看到这样:

    注册polls的admin.png

    tips:表单是根据Question自动生成的。不同的模型属性类型对应不同的html输入控件。对于DateTimeField类型,请确认settings里的TIME_ZONE设置。

戳这里查看下面的教程:Django入门-从0开始编写一个投票网站(二):part3-4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,373评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,732评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,163评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,700评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,036评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,425评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,737评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,421评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,141评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,398评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,908评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,276评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,907评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,018评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,772评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,448评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,325评论 2 261

推荐阅读更多精彩内容