title: Django 自定義管理命令:從入門到高階
date: 2024/5/16 18:34:29
updated: 2024/5/16 18:34:29
categories:
- 後端開發
tags:
- Django
- 自定義命令
- 入門教程
- 高階技巧
- 命令建立
- 命令使用
- 自定義管理
第 1 章 簡介
1.1 Django 管理命令簡介
Django 是一個流行的 Python 網路框架,提供了許多有用的工具和特性,幫助開發人員快速構建強大的 Web
應用程式。其中一項重要特性是管理命令,它允許您在命令列介面 (CLI) 中執行各種任務,如資料庫遷移、資料庫操作、快取清理和其他系統管理任務。
1.2 Django 管理命令的優勢
- 易於擴充套件:您可以輕鬆地建立自定義管理命令,以滿足您的專案需求。
- 一致的使用者介面:管理命令使用一致的使用者介面,這使得學習和使用管理命令變得更加簡單。
- 易於整合:管理命令可以很容易地整合到您的 CI/CD 管道中,以實現自動化部署和測試。
- 易於除錯:管理命令可以幫助您快速除錯和診斷問題,而無需開啟 IDE 或使用其他除錯工具。
1.3 內建管理命令的結構
Django 提供了許多內建管理命令,這些命令可以幫助您執行各種任務。例如,makemigrations
和migrate
命令用於資料庫遷移,createsuperuser
命令用於建立管理員使用者,runserver
命令用於啟動開發伺服器。
AD:首頁 | 一個覆蓋廣泛主題工具的高效線上平臺
下面是一個內建管理命令的示例,名為inspectdb
:
# myapp/management/commands/inspectdb.py
from django.core.management.base import BaseCommand
from django.db.connection import DatabaseWrapper
class Command(BaseCommand):
help = 'Prints the models that would be created by inspecting the '
'database tables.'
def add_arguments(self, parser):
parser.add_argument('appname', nargs='?',
type=str, default='',
help='App name to inspect (optional).')
def handle(self, *args, **options):
db = DatabaseWrapper(connections['default'])
if options['appname']:
self.stdout.write('Inspecting database for app "%s"...' %
options['appname'])
else:
self.stdout.write('Inspecting all apps...')
# ...
self.stdout.write('The following models would be created:')
# ...
在這個示例中,我們可以看到內建管理命令的基本結構。它包括以下幾個部分:
import
語句:匯入所需的模組。Command
類:繼承自django.core.management.base.BaseCommand
類,定義自定義管理命令的行為。add_arguments
方法:定義管理命令的選項和引數。handle
方法:定義管理命令的主要邏輯。
第 2 章 建立自定義管理命令
2.1 建立一個簡單的管理命令
在 Django 中建立自定義管理命令非常簡單。首先,您需要在您的應用目錄下建立一個名為management/commands
的目錄。在這個目錄中,您可以建立一個
Python 檔案,檔名就是您的管理命令名。例如,如果您想建立一個名為greet
的管理命令,您可以在management/commands
目錄下建立一個名為greet.py
的檔案。
下面是一個簡單的greet
管理命令的示例:
# myapp/management/commands/greet.py
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Greets the user'
def add_arguments(self, parser):
parser.add_argument('name', type=str, help='The name of the person to greet')
def handle(self, *args, **options):
name = options['name']
self.stdout.write(f'Hello, {name}!')
在這個示例中,我們建立了一個名為greet
的管理命令,它接受一個名為name
的引數,並列印出一條問候資訊。
2.2 探索不同型別的選項和引數
Django 管理命令支援多種型別的選項和引數。您可以使用add_arguments
方法來定義這些選項和引數。
AD:專業搜尋引擎
- 位置引數:這些引數沒有字首,直接跟在命令後面。在上面的示例中,
name
就是一個位置引數。 - 選項:這些引數以
--
或-
開頭,可以有值,也可以沒有值。例如,--verbosity
就是一個選項,它控制命令的詳細程度。
下面是一個帶有選項的管理命令示例:
# myapp/management/commands/greet.py
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Greets the user'
def add_arguments(self, parser):
parser.add_argument('name', type=str, help='The name of the person to greet')
parser.add_argument('--upper', action='store_true', help='Convert the greeting to uppercase')
def handle(self, *args, **options):
name = options['name']
greeting = f'Hello, {name}!'
if options['upper']:
greeting = greeting.upper()
self.stdout.write(greeting)
在這個示例中,我們新增了一個名為--upper
的選項,它將問候資訊轉換為大寫字母。
第 3 章 使用 Django ORM
3.1 在自定義管理命令中使用 Django ORM 進行資料庫操作
Django 提供了一個強大的物件關係對映(ORM)框架,使我們可以在 Python 程式碼中進行資料庫操作。在自定義管理命令中使用 Django ORM
非常簡單。首先,您需要匯入您的模型。然後,您可以使用模型的 API 進行查詢、建立、更新和刪除操作。
下面是一個使用 Django ORM 建立一個新使用者的示例:
# myapp/management/commands/create_user.py
from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
class Command(BaseCommand):
help = 'Create a new user'
def add_arguments(self, parser):
parser.add_argument('username', type=str, help='The username of the new user')
parser.add_argument('--email', type=str, help='The email of the new user')
parser.add_argument('--password', type=str, help='The password of the new user')
def handle(self, *args, **options):
username = options['username']
email = options['email']
password = options['password']
user = User.objects.create_user(username, email, password)
self.stdout.write(f'User {user.username} created successfully.')
在這個示例中,我們建立了一個名為create_user
的管理命令,它接受一個名為username
的位置引數,以及一個名為--email
和--password
的選項。我們使用 Django ORM 的create_user
方法建立了一個新使用者。
3.2 探索資料遷移與自定義管理命令的關係
資料遷移是 Django 中管理資料庫結構的一種機制。在自定義管理命令中,您可以使用資料遷移來執行資料庫結構的更改。
AD:漫畫首頁
首先,您需要建立一個新的資料遷移檔案。您可以使用 Django 的makemigrations
命令來建立一個新的資料遷移檔案。
python manage.py makemigrations myapp
在這個命令中,myapp
是您的應用名稱。這個命令將建立一個新的資料遷移檔案,檔名類似於0001_initial.py
。
接下來,您可以在這個檔案中編寫您的資料遷移程式碼。
下面是一個簡單的資料遷移示例:
# myapp/migrations/0001_initial.py
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('myapp', '__first__'),
]
operations = [
migrations.CreateModel(
name='MyModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
),
]
在這個示例中,我們建立了一個名為MyModel
的新模型。
最後,您可以使用 Django 的migrate
命令來執行資料遷移。
python manage.py migrate myapp
在這個命令中,myapp
是您的應用名稱。這個命令將執行資料遷移,並更新資料庫結構。
第 4 章 處理輸入和輸出
4.1 學習如何處理使用者輸入和控制輸出格式
在 Django 中處理使用者輸入和輸出非常簡單。在自定義管理命令中,您可以使用argparse
模組來處理使用者輸入,並使用 Python
標準庫中的print
和format
函式來控制輸出格式。
下面是一個使用argparse
模組處理使用者輸入的示例:
# myapp/management/commands/my_command.py
from django.core.management.base import BaseCommand
import argparse
class Command(BaseCommand):
help = 'My command'
def add_arguments(self, parser):
parser.add_argument('input', type=int, help='The input value')
def handle(self, *args, **options):
input_value = options['input']
# Do something with input_value
self.stdout.write(f'Input value: {input_value}')
在這個示例中,我們建立了一個名為my_command
的管理命令,它接受一個名為input
的位置引數。我們使用argparse
模組的add_argument
方法來定義這個引數。
接下來,我們可以使用format
函式來控制輸出格式。
self.stdout.write(f'Input value: {input_value}')
在這個示例中,我們使用format
函式將輸入值格式化為字串,並使用stdout.write
方法將輸出寫入控制檯。
4.2 探索如何將輸出重定向到檔案或管道中
在 Django 中,您可以將輸出重定向到檔案或管道中。這可以使用 Python 標準庫中的sys.stdout
和sys.stderr
物件來實現。
下面是一個將輸出重定向到檔案的示例:
# myapp/management/commands/my_command.py
import sys
# ...
def handle(self, *args, **options):
# Save stdout to a file
with open('output.txt', 'w') as f:
sys.stdout = f
# Do something
self.stdout.write('Hello, world!')
# Restore stdout
sys.stdout = sys.__stdout__
在這個示例中,我們使用sys.stdout
物件將輸出重定向到一個檔案中。首先,我們將sys.stdout
物件重定向到一個檔案物件。然後,我們可以使用stdout.write
方法將輸出寫入檔案。最後,我們將sys.stdout
物件重定向回控制檯。
同樣,我們可以將輸出重定向到管道中。
# myapp/management/commands/my_command.py
import sys
# ...
def handle(self, *args, **options):
# Send output to a pipe
sys.stdout = sys.stdout.buffer
# Do something
self.stdout.write(b'Hello, world!')
# Restore stdout
sys.stdout = sys.__stdout__
在這個示例中,我們將sys.stdout
物件重定向到一個管道中。首先,我們將sys.stdout
物件重定向到一個緩衝區物件。然後,我們可以使用stdout.write
方法將輸出寫入管道。最後,我們將sys.stdout
物件重定向回控制檯。
第 5 章 模擬 Django 內建命令
5.1 學習如何模擬 Django 內建命令的行為,如makemigrations
和migrate
要模擬 Django 內建命令的行為,例如makemigrations
和migrate
,您可以建立自定義的管理命令,並在其中呼叫 Django 內建命令的相應功能。
以下是一個示例,演示如何模擬makemigrations
命令:
# myapp/management/commands/mymakemigrations.py
from django.core.management.commands import makemigrations
class Command(makemigrations.Command):
help = 'Custom makemigrations command'
def handle(self, *args, **options):
# Your custom code here
super().handle(*args, **options)
在這個示例中,我們建立了一個名為mymakemigrations
的自定義管理命令,並繼承了 Django 內建命令makemigrations.Command
。在handle
方法中,您可以新增您自己的邏輯,然後呼叫super().handle(*args, **options)
來執行原始的makemigrations
命令。
您可以按照類似的方式模擬migrate
命令或其他 Django 內建命令。
5.2 探索如何擴充套件現有的內建命令
要擴充套件現有的內建命令,您可以建立一個新的管理命令,並在其中新增自定義的功能或選項。
以下是一個示例,演示如何擴充套件showmigrations
命令:
# myapp/management/commands/myshowmigrations.py
from django.core.management.commands import showmigrations
class Command(showmigrations.Command):
help = 'Custom showmigrations command'
def add_arguments(self, parser):
super().add_arguments(parser)
parser.add_argument(
'--app', dest='app', default=None,
help='Show only migrations for a specific app',
)
def handle(self, *args, **options):
app = options.get('app')
if app:
# Show only migrations for the specified app
# Your custom code here
else:
super().handle(*args, **options)
在這個示例中,我們建立了一個名為myshowmigrations
的自定義管理命令,並擴充套件了showmigrations.Command
。我們透過覆蓋add_arguments
方法新增了一個新的選項--app
,用於指定要顯示遷移的應用程式。在handle
方法中,我們檢查是否指定了應用程式,並根據需要新增自定義邏輯。
透過類似的方式,您可以擴充套件和定製任何其他 Django 內建命令,以滿足您的特定需求。
第 6 章 在生產環境中使用自定義管理命令
6.1 學習如何在生產環境中安全地使用自定義管理命令
在生產環境中使用自定義管理命令時,需要特別注意安全性和穩定性。以下是一些最佳實踐:
- 測試:在將自定義命令部署到生產環境之前,確保在開發或測試環境中對其進行了徹底的測試。
- 許可權:確保執行管理命令的使用者具有適當的許可權,並且不會因為執行命令而暴露敏感資料或系統資源。
- 日誌記錄:在命令中實現詳細的日誌記錄,以便在出現問題時可以追蹤和診斷。
- 錯誤處理:確保命令能夠妥善處理錯誤,避免因為單個錯誤導致整個應用程式崩潰。
- 監控:監控命令的執行情況,確保它們按照預期執行,並在出現問題時及時通知。
6.2 探索如何透過 Django 管理介面觸發管理命令
Django 管理介面本身不直接支援觸發管理命令,但您可以透過建立自定義的管理操作來實現類似的功能。以下是一個簡單的示例,說明如何建立一個管理操作來觸發自定義管理命令:
首先,建立一個自定義管理命令:
# myapp/management/commands/mycommand.py
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'My custom command'
def handle(self, *args, **options):
# Your custom command logic here
pass
然後,在您的模型管理類中建立一個自定義操作:
# myapp/admin.py
from django.contrib import admin
from django.core.management import call_command
class MyModelAdmin(admin.ModelAdmin):
actions = ['action_mycommand']
def action_mycommand(self, request, queryset):
# Call the custom command
call_command('mycommand')
action_mycommand.short_description = "Run my custom command"
admin.site.register(MyModel, MyModelAdmin)
在這個示例中,我們建立了一個名為action_mycommand
的管理操作,它呼叫了我們之前建立的自定義管理命令mycommand
。使用者可以透過
Django 管理介面的操作選單選擇這個操作來觸發命令。
請注意,這種方法需要謹慎使用,因為它允許透過管理介面直接執行命令,可能會帶來安全風險。確保只有受信任的使用者可以訪問管理介面,並且命令的執行不會對生產環境造成不利影響。
第 7 章 進階主題
7.1 學習如何在多執行緒或分散式環境中使用自定義管理命令
在多執行緒或分散式環境中使用自定義管理命令需要特別注意,以避免併發問題和資料不一致。以下是一些最佳實踐:
- 鎖定:在執行管理命令時,使用資料庫鎖定或其他同步機制來確保在同一時間只有一個程序/執行緒可以執行命令。
- 分片:如果您的應用程式在多個資料庫例項中分片資料,請確保在執行管理命令時能夠正確處理分片。
- 日誌記錄:在命令中實現詳細的日誌記錄,以便在出現問題時可以追蹤和診斷。
- 錯誤處理:確保命令能夠妥善處理錯誤,避免因為單個錯誤導致整個應用程式崩潰。
7.2 探索如何將自定義管理命令整合到 CI/CD 管道中
將自定義管理命令整合到 CI/CD 管道中可以自動化部署過程,並確保每次部署都經過完整的測試和驗證。以下是將自定義管理命令整合到
CI/CD 管道中的一般步驟:
- 將管理命令新增到版本控制:將自定義管理命令的原始碼新增到版本控制系統中,以便在每次部署時都能夠訪問它。
- 在 CI 環節中執行測試:在構建過程中,執行測試套件,確保自定義管理命令已透過完整的測試。
- 在 CD 環節中執行部署:在部署過程中,使用自定義管理命令執行部署任務,例如資料庫遷移、快取清除、資料清理等。
具體實現方法取決於您使用的 CI/CD 工具和部署方法。以下是一個使用 GitHub Actions 和 Django 部署到 Heroku 的示例:
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: python manage.py test
- name: Deploy to Heroku
uses: akhileshns/heroku-deploy@v3.10.1
with:
heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
app_name: myapp
deploy_branch: main
buildpack: heroku/python
config_vars: |
DJANGO_SETTINGS_MODULE=myapp.settings.production
SECRET_KEY=${{ secrets.SECRET_KEY }}
add_dot_env: false
python_version: python-3.9.2
install_command: pip install -r requirements.txt
migration_command: python manage.py migrate
release_command: python manage.py mycommand
在這個示例中,我們使用 GitHub Actions 構建一個 CI/CD 管道,在部署到 Heroku 時執行資料庫遷移和自定義管理命令mycommand
。請根據您的實際需求進行修改。
附錄
參考資料
- Django 文件 - 自定義管理命令:https://docs.djangoproject.com/en/4.0/howto/custom-management-commands/
- Heroku 文件 - Python 構建包:https://devcenter.heroku.com/articles/python-support#buildpack-detect-and-build
- GitHub Actions 文件 - Heroku 部署動作:https://github.com/marketplace/actions/deploy-to-heroku
常見問答
Q: 在多執行緒或分散式環境中,如何確保自定義管理命令的原子性?
A: 可以使用資料庫事務或其他同步機制來確保自定義管理命令的原子性。在執行命令時,首先開始一個事務,然後在事務中執行命令。如果命令成功完成,則提交事務;如果命令失敗,則回滾事務。
Q: 如何在自定義管理命令中處理命令列引數?
A: 可以使用 Django 的argparse
模組來處理命令列引數。在自定義管理命令中,可以使用parser.add_argument
函式新增一個引數,然後使用parser.parse_args
函式獲取引數值。例如:
from django.core.management.base import BaseCommand
import argparse
class Command(BaseCommand):
help = 'My custom command'
def add_arguments(self, parser):
parser.add_argument('--my-param', type=int, help='My custom parameter')
def handle(self, *args, **options):
my_param = options['my_param']
# Do something with my_param
Q: 如何在自定義管理命令中訪問 Django 設定?
A: 可以使用django.conf
模組中的settings
變數來訪問 Django 設定。例如:
from django.conf import settings
def my_function():
secret_key = settings.SECRET_KEY
# Do something with secret_key
Q: 如何在自定義管理命令中訪問資料庫?
A: 可以使用 Django 的django.db
模組中的connections
變數來訪問資料庫。例如:
from django.db import connections
def my_function():
with connections['default'].cursor() as cursor:
cursor.execute('SELECT * FROM myapp_mymodel')
rows = cursor.fetchall()
# Do something with rows
Q: 如何在自定義管理命令中處理檔案上傳?
A: 可以使用 Django 的django.core.files.uploadedfile
模組中的UploadedFile
類來處理檔案上傳。例如:
from django.core.files.uploadedfile import UploadedFile
def my_function(file):
with UploadedFile(file, name='myfile.txt') as f:
# Do something with f
Q: 如何在自定義管理命令中傳送電子郵件?
A: 可以使用 Django 的django.core.mail
模組中的send_mail
函式來傳送電子郵件。例如:
from django.core.mail import send_mail
def my_function():
send_mail(
'Subject here',
'Here is the message.',
'from@example.com',
['to@example.com'],
fail_silently=False,
)
Q: 如何在自定義管理命令中使用 Django 模型?
A: 可以使用 Django 的django.db.models
模組中的Model
類來使用 Django 模型。例如:
from myapp.models import MyModel
def my_function():
obj = MyModel.objects.get(id=1)
# Do something with obj
Q: 如何在自定義管理命令中使用 Django 檢視和模板?
A: 在自定義管理命令中,不能直接使用 Django 檢視和模板。但是,可以使用 Django 的django.shortcuts
模組中的render
函式來渲染一個模板,並返回一個 HTTP 響應。然後,可以使用 Django 的django.http
模組中的HttpResponse
類來返回該響應。例如:
from django.shortcuts import render
from django.http import HttpResponse
def my_function():
context = {'my_var': 'Hello, world!'}
response = render(request, 'mytemplate.html', context)
return HttpResponse(response.content)
注意:在這個示例中,request
變數是一個假的HttpRequest
物件,可以使用django.test.RequestFactory
類來建立。例如:
from django.test import RequestFactory
request = RequestFactory().get('/')
Q: 如何在自定義管理命令中使用 Django 快取?
A: 可以使用 Django 的django.core.cache
模組中的cache
函式來使用 Django 快取。例如:
from django.core.cache import cache
def my_function():
cache.set('my_key', 'my_value', 3600)
value = cache.get('my_key')
# Do something with value
Q: 如何在自定義管理命令中使用 Django 簽名?
A: 可以使用 Django 的django.core.signing
模組中的dumps
和loads
函式來使用 Django 簽名。例如:
from django.core.signing import dumps, loads
def my_function():
data = {'my_var': 'Hello, world!'}
signed_data = dumps(data)
loaded_data = loads(signed_data)
# Do something with loaded_data
Q: 如何在自定義管理命令中使用 Django 會話?
A: 可以使用 Django 的django.contrib.sessions
模組中的SessionStore
類來使用 Django 會話。例如:
from django.contrib.sessions.backends.db import SessionStore
def my_function():
session = SessionStore()
session['my_key'] = 'my_value'
session.save()
value = session.get('my_key')
# Do something with value
Q: 如何在自定義管理命令中使用 Django 過濾器?
A: 可以使用 Django 的django.contrib.humanize
模組中的過濾器來格式化資料。例如:
from django.contrib.humanize.templatetags.humanize import intcomma
def my_function():
value = 1000000
formatted_value = intcomma(value)
# Do something with formatted_value
Q: 如何在自定義管理命令中使用 Django 模板標籤?
A: 可以使用 Django 的django.template.defaultfilters
模組中的模板標籤來格式化資料。例如:
from django.template.defaultfilters import floatformat
def my_function():
value = 1000.123456
formatted_value = floatformat(value, 2)
# Do something with formatted_value
Q: 如何在自定義管理命令中使用 Django 模板過濾器?
A: 可以使用 Django 的django.template.context_processors
模組中的模板過濾器來格式化資料。例如:
from django.template.context_processors import csrf
def my_function():
request = ... # Assume this is a valid HttpRequest object
context = {}
context.update(csrf(request))
formatted_value = context['csrf_token']
# Do something with formatted_value
Q: 如何在自定義管理命令中使用 Django 模板上下文處理器?
A: 可以使用 Django 的django.template.context_processors
模組中的模板上下文處理器來向模板上下文中新增變數。例如:
from django.contrib.auth.context_processors import auth
def my_function():
request = ... # Assume this is a valid HttpRequest object
context = {}
context.update(auth(request))
user = context['user']
# Do something with user
Q: 如何在自定義管理命令中使用 Django 模板載入器?
A: 可以使用 Django 的django.template.loaders.app_directories.Loader
類來載入模板。例如:
from django.template.loader import Loader
def my_function():
loader = Loader()
template = loader.get_template('myapp/mytemplate.html')
context = {'my_var': 'Hello, world!'}
html = template.render(context)
# Do something with html
Q: 如何在自定義管理命令中使用 Django 模板引擎?
A: 可以使用 Django 的django.template.Engine
類來渲染模板。例如:
from django.template import Engine
def my_function():
engine = Engine()
template = engine.get_template('myapp/mytemplate.html')
context = {'my_var': 'Hello, world!'}
html = template.render(context)
# Do something with html
Q: 如何在自定義管理命令中使用 Django 模板解析器?
A: 可以使用 Django 的django.template.base
模組中的模板解析器來解析模板。例如:
from django.template.base import Parser
def my_function():
parser = Parser()
template = parser.parse('myapp/mytemplate.html')
# Do something with template
Q: 如何在自定義管理命令中使用 Django 模板標籤庫?
A: 可以使用 Django 的django.template.defaulttags
模組中的模板標籤庫來註冊模板標籤。例如:
from django.template.defaulttags import register
@register.simple_tag
def my_tag(value):
return 'Hello, {}!'.format(value)
def my_function():
from django.template import Template, Context
template = Template('{% load mytags %}{{ value|my_tag }}')
context = Context({'value': 'world'})
html = template.render(context)
# Do something with html
Q: 如何在自定義管理命令中使用 Django 模板過濾器庫?
A: 可以使用 Django 的django.template.defaultfilters
模組中的模板過濾器庫來註冊模板過濾器。例如:
from django.template.defaultfilters import register
@register.filter
def my_filter(value):
return 'Hello, {}!'.format(value)
def my_function():
from django.template import Template, Context
template = Template('{{ value|my_filter }}')
context = Context({'value': 'world'})
html = template.render(context)
# Do something with html
Q: 如何在自定義管理命令中使用 Django 模板自定義標籤?
A: 可以使用 Django 的django.template.base
模組中的Library
類來註冊自定義標籤。例如:
from django.template.base import Library
register = Library()
@register.inclusion_tag('myapp/mytag.html')
def my_tag(value):
return {'value': value}
def my_function():
from django.template import Template, Context
template = Template('{% load mytags %}{% my_tag "world" %}')
context = Context()
html = template.render(context)
# Do something with html
Q: 如何在自定義管理命令中使用 Django 模板自定義過濾器?
A: 可以使用 Django 的django.template.base
模組中的Library
類來註冊自定義過濾器。例如:
from django.template.base import Library
register = Library()
@register.filter
def my_filter(value):
return 'Hello, {}!'.format(value)
def my_function():
from django.template import Template, Context
template = Template('{{ "world"|my_filter }}')
context = Context()
html = template.render(context)
# Do something with html
Q: 如何在自定義管理命令中使用 Django 模板自定義SimpleTag?
A: 可以使用 Django 的django.template.base
模組中的Library
類和SimpleTag
類來註冊自定義