天天看點

python自學日記27——django入門python自學日記27——django入門

python自學日記27——django入門

這段時間一直在折騰資料結構和算法問題,弄得我也是相當頭大。有的資料确實不适合入門,看到二叉搜尋樹和圖時确實有點懵,隻講了如何建構,但沒講怎麼用,看着代碼敲完一遍也沒啥感覺。有些還難以了解。

這段時間也讓我對學習python和學習程式設計有了新的認識。就像我昨天回答一個知乎提問說的,有的人想學Python應該要想清楚是喜歡Python還是喜歡程式設計,如果喜歡程式設計那應該多學幾門語言。因為這就像學習自然語言一樣,你認知的邊界就是你語言的邊界,你可以通過學習另一門語言來拓寬視野,這也是我一直覺得在可能情況下多學幾門外語的原因。

回到程式設計上來,從最近學習資料結構和算法來說,我就發現如果隻用Python來學資料結構和算法,比較難通過Python的實作來完全了解和掌握這些,這個和學習基礎不一樣,基礎隻要跟着一本好的資料敲代碼就差不多了,但是算法需要從多個例子中總結其中的規律和實作方法。一個算法和資料結構在Python中可能就好幾種實作,但是因為語言的限制不會有太大的差别,如果想對這個有更加深入的了解,從C語言、java的角度來實作就會對你了解這些更有幫助。從其他程式設計語言的角度來看你以前實作過的方法和函數會給你帶來不一樣的認識。

是以,從以前想單單把Python學好,現在開始學一些别的語言作為輔助。最近看了前端、java。

本來是希望在兩周内把基本的資料結構和算法大緻過一遍,從現在看就剩樹和圖有些問題,當然進度也在預期内,不過想學好算法并不是短期内能成功的事,後面就把資料結構和算法這塊當做一個定期學習的任務。

現在開始做一些别的内容,因為最近看了前端嘛,想着就把web開發也學一下。那就從Django開始簡單入門下。

學這塊發現跟前面的基礎和算法就差別挺大的了,首先一上來就是要建立虛拟環境。

然後又提出項目的概念,本來以前都是在jupyter notebook中單個檔案寫代碼,現在開始要按項目來了。

說到虛拟環境就完全不了解,以前隻聽說過虛拟機,開發Python時不是安裝了anaconda了內建開發環境了嘛,為什麼還要虛拟環境呢,我從原來剛開始學程式設計時吃過各種環境變量、編譯器、運作環境等問題的虧,以前為了準備這些東西都能把我好不容易積攢的學程式設計的樂趣給消耗殆盡,是以現在完全不糾結用什麼編譯器,文本編輯器等軟體,這次遇到虛拟環境第一個想到的就是這到底是不是必須的,能不能不安裝,你說要安裝就安裝總得給個理由吧,然後上網查,别人都隻說建立虛拟環境用virtualenv,虛拟環境的作用是為了将新項目所需要的庫與原來通用的庫隔開。

反正都說好,具體哪裡好也沒說明白,然後看到步驟上多是Linux,或者Mac上的指令符,就想找個windows版本的,然後在b站找到視訊看到視訊下面有提到anaconda一嘴,發現好像他們講的并不适合anaconda。是以還得找用anaconda建立虛拟環境的方法。

由于步驟網上都有,我隻記錄我自己認為對我和其他學習這塊内容時有用的提示:

  1. 如果你裝了anaconda可以用anaconda Prompt建立虛拟環境,方法很簡單,建立虛拟環境其實就像建立了一個檔案夾一樣,虛拟環境需要激活,激活:activate+虛拟環境名;
  2. 在使用虛拟環境安裝Django的過程中才發現pip和conda是有差別的,我用pip安裝一遍發現虛拟環境檔案下沒有,還安裝在原來檔案下了,用conda安裝才出現在虛拟環境檔案下,具體的差別可以上網查一下,差別不大。因為我以前都是用pip這次突然發現差別值得記錄一下。
  3. 很多網上的或者書上的教程或問題解決方案随着時間的推移可能都不再合适,需要自己來辨識。就像我在建立Django項目時,按照書上的步驟

    django-admin.py startproject learning_log .

    無法将項目建立到我想要的檔案夾下,總是把檔案建立到Django安裝檔案夾下,後面根據網上的步驟将二者結合,先在anaconda prompt中修改目錄,然後再輸入

    django-admin startproject learning_log .

    才在自己建立的檔案夾下建立了項目。
  4. 如果你跟着教程敲完代碼後報錯,排除了文法和自己輸入錯誤後你可以勇于判斷是教程的代碼有問題,要麼代碼本身錯了,要麼是代碼由于過時導緻的錯誤。以前我總是懷疑是自己的問題,後面發現确實教程過時速度太快。是以我才一直想說不要隻看别人的例子,要從例子中總結出自己的思路。

就像下面的問題,Django項目中讓修改models.py檔案

from django.db import models

# Create your models here.
class Topic(models.Model):
    #使用者學習主題
    text=models.CharField(max_length=200)
    date_added=models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        '''傳回模型的字元串表示'''
        return self.text

class Entry(models.Model):
    '''學到的有關某個主題的具體知識'''
    topic=models.ForeignKey(Topic)#這一行出錯了
    text=models.TextField()
    date_added=models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name_plural='entries'
        
    def __str__(self):
        '''傳回模型的字元串表示'''
        return self.text[:50] + '...'

           

一般修改這個管理資料需要三步,第一步修改models.py,第二步執行指令python manage.py makemigrations app_name,在執行指令python manage.py migrate讓Django遷移項目。但是這次在第二步時報錯了,報錯内容:

File "E:\jupyter notebook\Django\project\learning_logs\models.py", line 27, in Entry
    topic = models.ForeignKey(Topic)
TypeError: __init__() missing 1 required positional argument: 'on_delete'
           

我檢查了一遍代碼發現和例子中的代碼沒有差別,那就應該是例子本身除了問題,然後上網查到将15行改為:

topic=models.ForeignKey(Topic,on_delete=models.CASCADE)
           

在後面添加on_delete=models.CASCADE即可。原因是:在django2.0後,定義外鍵和一對一關系的時候需要加on_delete選項,此參數為了避免兩個表裡的資料不一緻問題,不然會報錯。老版本中models.CASCADE是預設值。這就是由于更新導緻了教程出了問題。

在寫models.py檔案時遇到一個内部類的問題,第一次遇到是以記錄一下,在定義一個類中還可以定義一個類class Meta,這個是給model定義中繼資料。中繼資料:不是一個字段的任何資料。感覺和自己了解的中繼資料不太一樣。

常見屬性有:

app_label:隻有一種使用情況,就是你的模型類不再應用程式包下的models.py中,需要制定這個模型類是那個應用程式包的,看樣子是可以跨檔案使用的。

app_label='程式名'
           

再說一個現在遇到的:verbose_name_plural,這個選項制定模型的複數形式是什麼:

verbose_name_plural='entries'
           

如果不提供這個屬性,Django會使用verbose_name+‘s’,也就是Entrys.

建立一個項目總是記不住步驟來回翻,把這個記錄一下:

  1. 打開anaconda prompt,啟動虛拟環境:activate my_env(環境名)
  2. 切換目錄,找到你想建立項目的檔案夾:cd E:\jupyter notebook\Django\pizzeria
  3. 建立項目:

    django-admin startproject learning_log .

    learning_log是項目名,可以随便替換,後面空格後加一個’.’,這是必須的。
  4. 建立資料庫:

    python manage.py migrate

    ,項目檔案中新增一個db.sqlite3的檔案。
  5. 核實項目是否建立成功,啟動伺服器:

    python manage.py runserver

    ,然後可以到URL http://http://127.0.0.1:8000/,打開檢視是否成功了。在anaconda prompt按Ctrl+C或者關閉視窗可關閉伺服器。
  6. 建立應用程式:因為此時指令視窗已經運作伺服器了,需要再打開一個anaconda prompt,重新走1,2兩步到目錄:

    python manage.py startapp appname

    ,此時項目檔案中會新增一個appname的檔案夾,打開這個檔案夾。
  7. 定義模型:打開models.py從裡面就可以定義想要的類了。這樣就可以用到面向對象程式設計的知識了。
  8. 激活模型:打開3中建立的項目名檔案,找到settings.py,在INSTALLED_APPS的清單最後添加一個a應用程式名,就是6步中的appname.格式跟前面的需一緻。
  9. 需要讓Django修改資料庫,使其能夠存儲與建立模型相關的資訊。即上面講過的對appname調用makemigrations,在anaconda prompt中輸入:

    python manage.py makemigrations appname

    ,名利makemigrations讓Django确定如何修改資料庫,使其能夠存儲與我們定義新模型相關聯的資料。
  10. 應用遷移,讓Django替我們修改資料庫:

    python manage.py migrate

  11. django管理網站
    • 建立超級使用者:

      python manage createsuperuser

      ,這裡需要注意下,後面會讓輸入使用者名,email,兩遍密碼。這兩遍密碼輸入是沒有反應的,我剛開始以為鍵盤出毛病了,檢測下鍵盤沒事,然後覺得可能指令視窗卡死了,重新開機還是這樣,查了下發現這是正常現象,密碼輸入有顯示星号的,有顯示圓點的,這裡就是什麼都不顯示也不回報的,連輸兩遍如果對了就報對,錯了就讓你重輸入。
    • 向管理者注冊模型:在models.py所在目錄中建立了一個名為admin.py的檔案,打開修改,添加
      from appname.models import +7步中的類名
      
      admin.site.register(7步中的類名)
                 
      這裡我出了一個錯誤,上面一行用逗号将兩個類名隔開,下面也在括号裡這樣做導緻報錯,下面應該将二者用兩行寫
      from django.contrib import admin
      
      # Register your models here.
      from pizzas.models import Pizza,Topping
      admin.site.register(Pizza,Topping)#上面可以寫到一起,但是下面需要分開
                 
      正确的應該是隔開的,這就是沒動腦子靠記憶寫的問題
      admin.site.register(Pizza)
      admin.site.register(Topping)
                 
      修改這邊是不需要走9和10兩步的,隻有修改models.py才需要走9和10兩步。

最好的教程根本堆疊基本知識和例子,而是把自己解決問題的思路和學習的方法傳遞出去。對于我自己來說我希望的是我寫的内容讓我過段時間回過來再看是依然有效的,如果隻是把例子寫下來那是對我對大家都沒什麼用的。