我們再使用django寫專案的時候,不可避免的我們會使用到一些manage命令,如django-admin startproject,python manage.py runserver …等命令,然後這些命令就能完成相應的事情。
但有時候django自帶的這些命令也不能滿足我們的需求,我們就可以自己編寫實現自己的一些需求的命令了。
例如:我們實現乙個createuser的命令。我們在終端執行這條命令的時候,就會在資料庫建立乙個user物件出來。
from django.db import models
# create your models here.
class
user
(models.model)
: name = models.charfield(max_length=20)
telephone = models.charfield(max_length=11)
email = models.emailfield(
)
然後在settings.py檔案裡面配置好資料庫的相關資訊,因為我使用的是mysql資料庫,所以需要配置,如果使用django預設的sqlite資料庫,就不用配置。
然後執行makemigrations和migrate命令,將模型對映到資料庫中。
至此,我們就做好準備工作了。
在django中,我們想要編寫自定義的manage命令,舊的遵循django的規則來建立檔案。
首先,我們建立乙個名為command
的類,這個類的名字必須為這個。然後繼承自django.core.management.basecommand
類。
from django.core.management import basecommand
class
command
(basecommand)
:help
='建立乙個user使用者'
defhandle
(self,
*args,
**options)
:pass
help
這個變數可寫可不寫,這個變數的作用是在使用命令的-h
或--help
引數時會顯示出來的文字,在這裡我們可以寫入這條命令的作用,描述。
handle
函式:這個函式是必須寫的函式,我們使用這條命令的時候就會執行這個函式裡面的**。
因為我們這條命令的主要功能是建立乙個user使用者,所以我們首先匯入user物件,然後開始編寫**。
from user.models import user
class
command
(basecommand)
:help
='建立乙個user使用者'
defhandle
(self,
*args,
**options)
: user.objects.create(name=
'aaa'
,telephone=
'1111111111'
,email=
) self.stdout.write(
'使用者建立成功'
)
注意: 這裡我們一般不使用print()列印資訊,而是使用self.stdout.write
來列印資訊。
這樣,我們就編寫好了一條簡單的建立乙個user物件的命令。然後我們在終端執行命令:
python manage.py selfcommand(在建立的包的下面的檔案的名字)
然後在終端就會列印出使用者建立成功
的資訊,然後我們去資料庫也能檢視到建立的user物件的資訊
但是,這個時候就會出現乙個比較尷尬的問題,就是我們建立user使用者的時候,肯定需要別人自己輸入資訊,但是我們並沒有讓別人自己輸入資訊,而是直接建立乙個定死的user物件。所以,這個時候就需要我們給這條命令新增引數了。
如果想給命令新增引數,那麼我們在這個類中就得新建乙個方法,名為add_argument
。
class
command
(basecommand)
:help
='建立乙個user使用者'
defadd_arguments
(self, parser)
: parser.add_argument(
'name'
,help
="指定name欄位"
)# name 必須引數,輸入的第乙個引數的值將賦值給name,必須引數
parser.add_argument(
'-t'
,'--telephone'
,help
="指定telephone欄位"
)# 可選引數 -t 或 --telephone -t是簡寫形式。
defhandle
(self,
*args,
**options)
: name = options[
'name'
]if options[
'telephone']:
telephone = options[
'telephone'
]else
: telephone =
'11111111111'
user.objects.create(name=name,telephone=telephone,email=
) self.stdout.write(
'使用者建立成功'
)
在上面我們定義了兩個引數,乙個必須引數,乙個可選引數,因此,我們再使用這條命令的時候必須傳入name引數,而telephone引數可以不傳,然後我們在handel
方法中對得到的引數進行了處理。
python manage.py selfcommand ccc
python manage.py selfcommand ddd -t 18888888888
我們也可以使用python manage.py -h
檢視這條命令的幫助,也能看到我麼自定義的引數。
我們再使用命令的時候,特別在使用一些剛接觸不久的命令的時候,很容易出現非正確的使用命令,那麼我們就需要丟擲乙個異常,告訴他命令使用錯誤了。
首先我們的匯入乙個類
from django.core.management import commanderror
例如,我們在傳入手機號碼的時候,如果位數超過了11位,那麼我們就丟擲乙個異常:
def
handle
(self,
*args,
**options)
: name = options[
'name'
]if options[
'telephone']:
telephone = options[
'telephone']if
len(telephone)
>=11:
raise commanderror(
"手機號碼不能超過11位"
)else
: telephone =
'11111111111'
user.objects.create(name=name,telephone=telephone,email=
) self.stdout.write(
'使用者建立成功'
)
這裡,我們就使用到了commanderror類來丟擲了異常,從而保證了我們程式的健壯性了。
當使用者輸入的**號碼長度大於11位的時候,就會丟擲乙個異常而終止程式。
注意: 我們在引數中輸入的值,在handel
函式中都是以字元竄的形式得到,就算我們輸入的是整數,也會變成字元竄的形式,如果想得到整數形式的值,我們可以在add_argument()中新增type=int
引數。
示例:
parser.add_argument(
'id'
,help
="user物件的id"
,type
=int
)
更多有關自定義manage命令的操作可以檢視官方文件: 編寫自定義特性
自定義特性一般標註在作用的程式元素的上方 編譯器首先組合特性名稱和attribute,然後尋找該組合名,所以特性名為fieldname和fieldnameattribute的兩個特性沒有區別 編譯器將尋找包含有這個名稱的類,它直接或者間接的派生資system.attribute 編寫自定義類的步驟 ...
編寫自定義GenericServlet
具體步驟如下 1 新建類mygenericservlet,實現servlet,servletconfig介面 2 重寫父類的相關方法 3 將service 方法定義為抽象 abstract 方法,將類定義為抽象類,以便在子類予以service 方法新的實現 4 定義mygenericservlet的...
Django 自定義標籤
模版是乙個用django模版語言標記過的python字串。模版可以包含模版標籤和變數。模版標籤是在乙個模版裡起作用的標記。比如,乙個模版標籤可以產生控制結構的內容 if或者for 可以獲取資料庫內容或者訪問其它模版標籤。乙個標籤塊被包圍 變數標籤被 包圍 context是乙個傳遞給模版的key va...