Django 2.0.7 使用小知識
Django 2.0.3 使用小知識
執行環境:
Python 3.6.4
Django 2.0.7
Django Admin中model顯示為中文
定義model時,定義一個Meta物件,設定需要顯示的中文名稱。verbose_name為單數名稱,verbose_name_plural為複數名稱。因為中文沒有區分單數、複數,所以都定義為一樣的名稱。
from django.db import models class Article(models.Model): class Meta: verbose_name = '文章' verbose_name_plural = '文章'
Django Admin中model欄位顯示為中文
定義model時,在每個欄位後增加verbose_name,如下例子中的title
class Article(models.Model):
class Meta:
verbose_name = '文章'
verbose_name_plural = '文章'
title = models.CharField(max_length=256, verbose_name='標題')
Django Admin中的app顯示為中文
在需要自定義名稱的app中(假設app目錄的blog),做如下修改
# blog/apps.py
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
verbose_name = '個人部落格'
# blog/__init__.py
default_app_config = 'blog.apps.HealthConfig'
警告:?: (urls.W005) URL namespace 'admin' isn't unique. You may not be able to reverse all URLs in this namespace
在urls.py中的urlpatterns中重複定義了admin,所以會有此警告,將重複定義的url註釋掉即可。
urlpatterns = [
url('', admin.site.urls),
url(r'^jet/', include('jet.urls', 'jet')),
# 註釋掉此行
# url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')),
]
Django 時區設定
此筆記為轉載
在Django的配置檔案settings.py
中,有兩個配置引數是跟時間與時區有關的,分別是TIME_ZONE
和USE_TZ
如果USE_TZ
設定為True
時,Django會使用系統預設設定的時區,即America/Chicago
,此時的TIME_ZONE
不管有沒有設定都不起作用。
如果USE_TZ
設定為False
,而TIME_ZONE
設定為None
,則Django還是會使用預設的America/Chicago
時間。若TIME_ZONE
設定為其它時區的話,則還要分情況,如果是Windows系統,則TIME_ZONE
設定是沒用的,Django會使用本機的時間。如果為其他系統,則使用該時區的時間,入設定USE_TZ = False
, TIME_ZONE = 'Asia/Shanghai'
, 則使用上海的UTC
時間。
修改Django預設埠號
Django預設埠號是8000,可以在啟動runserver的時候,指定埠號,例如 python manage.py runserver 0.0.0.0:8001
但這樣每次啟動都需要執行埠號的相關命令,理想的狀態下,是可以將埠號配置在配置檔案中,啟動時,根據配置檔案自動選擇對應的埠號
參考:https://stackoverflow.com/questions/23639085/django-change-default-runserver-port
對專案根目錄的manage.py進行修改,主要是註釋下面的部分,同時也可以修改預設地址。
#!/usr/bin/env python
import os
import sys
from django.conf import settings
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", cmdline.settings)
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
from django.core.management.commands.runserver import Command
# 修改預設地址
Command.default_addr = settings.HOST
# 修改預設埠號
Command.default_port = settings.PORT
execute_from_command_line(sys.argv)
QueryDict轉dict
Django中,request的POST和GET屬性,都是QueryDict的例項,直接用dict(request.GET)進行轉換(假設HttpRequest的例項為request),會發送value都為list的情況,即使value只是一個string,也會變成['張三'],正確的方法應該是request.GET.dict(),POST也是同樣的方法。
form_data = request.POST.dict()
JsonResponse接受非dict物件
預設情況下,JsonResponse要求接受一個dict物件,如果傳入list等非dict物件,對引發TypeError。這個時候在JsonResponse的引數中增加safe為False(預設為True),使其處理非dict物件。
return JsonResponse([], safe=False)
強制Django渲染靜態檔案
在Django的Debug模式關閉後,預設不會渲染靜態檔案。合理的做法應該是將靜態檔案部署到Nginx上,再Django中再進行配置。但是有些情況,比如專案規模極小,不希望引入Nginx,可以通過命令強制Django渲染靜態檔案。
python manage.py runserver --insec