Django入門-從0開始編寫一個投票網(wǎng)站(一)

本人搞iOS的,之前有需求所以學的Python,現(xiàn)在把筆記傳上來。
這是我看django的官方入門教程寫的筆記,懶得看英文的django0基礎的噴油們可以看看。那么開始:

準備

  1. 安裝python,或者看看其它博客,這個網(wǎng)上有好多。
  2. 選個編輯工具,之前用的PyCharm,感覺對于新手還挺友好的,去某寶買個碼就OK了?,F(xiàn)在學著用Atom,因為之前學RN的時候用的,所以也想試試看,atom中文社區(qū)里能找找推薦的插件。看自己愛好吧。
  3. 數(shù)據(jù)庫。Python包含了一個SQLite數(shù)據(jù)庫,我用的MySQL,單純?yōu)榱藢W習Django的話可以先跳過。官方特別提到的數(shù)據(jù)庫是PostgreSQL,MySQLOracleSQLite。
  4. 安裝pip。這是python的包管理工具:
    curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python
    sudo easy_install pip
    pip install xxx
    
    tip:如果有問題的話我也忘了怎么解決,因為這部分的筆記沒啦啦啦啦。
  5. 安裝虛擬環(huán)境。虛擬環(huán)境就是建立的專屬與項目的python環(huán)境,這樣不會因為項目繁多導致環(huán)境里一堆安裝包
    $ sudo pip install virtualenv
    $ mkdir /srv/vpython
    $ cd /srv/vpython
    $ virtualenv --no-site-packages 虛擬環(huán)境名
    進入虛擬環(huán)境:$ source /Users/admin/虛擬環(huán)境名/bin/activate
    退出虛擬環(huán)境:$ deactivate
    
    進入虛擬環(huán)境后,終端會變成這樣:(虛擬環(huán)境名) MacBook-Pro:目錄 用戶$
  6. 切換到虛擬環(huán)境后,安裝Django:
    pip install Django
    
    正式開始

part 1

  • 在虛擬環(huán)境下,cd到需要的路徑,創(chuàng)建一個名叫mysite的項目。運行:
    Django-admin startproject mysite
    
    用pycharm的話,新建django工程就可以。
    可以看到創(chuàng)建了這樣的目錄:
    mysite/
       manage.py
       mysite/
          __init__.py
          settings.py
          urls.py
          wsgi.py
    
    如果希望語言使用中文,settings.py里的LANGUAGE_CODE的值改成zh-hans即可。

  • 啟動開發(fā)用的服務器,后面會另外部署,測試學習的話用這個就行,pycharm直接跑就好了:
    python manage.py runserver
    
    runserver后面可以指定ip和端口,默認127.0.0.1:8000。
    此時會看到’You have unapplied migrations’的警告,先不管。

  • 在mysite根目錄(即與manage.py同級)下,創(chuàng)建名為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目錄下,創(chuàng)建一個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()函數(shù)用來添加其它的URLconf引用,并且沒有$符。
    url()函數(shù)有4個參數(shù),2個必選參數(shù),regex,view,2個可選參數(shù):kwargsname。

  • 在mysite目錄下運行
    python manage.py runserver
    
    用瀏覽器打開http://127.0.0.1:8000/polls,沒看到“ni hao shi jie”的頁面算我輸。

part 2

  • 創(chuàng)建數(shù)據(jù)庫。在mysite/settings.py文件里修改DATABASE里的字段:
    ENGIN:根據(jù)自己的數(shù)據(jù)庫選型,可以改成django.db.backends.sqlite3django.db.backends.postgresql、django.db.backends.mysql、django.db.backends.orcle,其它的可以在這里找。
    NAME:數(shù)據(jù)庫的name
    USER:數(shù)據(jù)庫的user
    PASSWORD:對應user的密碼
    HOST:本機的話就用‘127.0.0.1’
    PORT:端口

  • 在INTALLED_APPS里定義了所有的django應用,要使用這些應用,要在數(shù)據(jù)庫里建表:
    python manage.py migrate
    

  • 在polls應用里創(chuàng)建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的子類。例如CharField,DateTimeField,表示值的類型。
    所有的Filed類,都可以指定一個human-readable的name,這里pub_data指定了,其它的column的名字表意足夠清楚可以不用指定。
    有一些Field有必選參數(shù),CharField需要指定max_length。
    Field的可以賦值可選參數(shù),例如這里的votes就指定了默認值0
    有關聯(lián)的話可以設置外鍵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語句,放心它只是讓你看看而已,不會對數(shù)據(jù)庫做這些sql操作。

  • 真正對數(shù)據(jù)庫操作:
    python manage.py migrate
    
    所以綜上所述,要對models做更改,需要以下3步:
    1. 在models里修改model
    2. python manage.py makemigrations來為那些更改做migrations
    3. python manage.py migrate 讓數(shù)據(jù)庫應用這些更改
    

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

    然后終端(我的是mac)會顯示這些
    py_shell.png

    看看有多少問題:

    # '>>>' 不是你敲出來的,是shell上本來就有的
    >>> from polls.models import Question, Choice
    >>> Question.objects.all()
    
    創(chuàng)建一個question:
    >>> from django.utils import timezone
    >>> q = Question(question_text="what's up?", pub_date=timezone.now())
    >>> q.save()
    
    查看剛剛創(chuàng)建的question的屬性:
    >>> q.id
    >>> q.question_text
    >> q.pub_date
    
    查看所有的question:
    >>> Question.objects.all()
    
    可以看到打印所有的question時,出現(xiàn)了<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?>
    查看剛剛我們創(chuàng)建的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
    

  • 創(chuàng)建管理員用戶
    django默認有admin頁面,可以對應用作管理。首先創(chuàng)建管理員賬號:
    python manage.py createsuperuser
    
    按提示輸入用戶名,郵箱,密碼和確認密碼。密碼不能太普通(password之流),不能是純數(shù)字,不能跟郵箱類似。
    啟動服務器(如果已經(jīng)啟動則不需要重新啟動),登錄地址: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:表單是根據(jù)Question自動生成的。不同的模型屬性類型對應不同的html輸入控件。對于DateTimeField類型,請確認settings里的TIME_ZONE設置。

戳這里查看下面的教程:Django入門-從0開始編寫一個投票網(wǎng)站(二):part3-4

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容