基本配置 一、創建django程式 終端命令: django-admin startproject sitename IDE創建django程式時,本質上都是自動執行上述命令 其他常用命令:進入工程目錄 python manage.py runserver 127.0.0.1 埠號 運行測試 py ...
基本配置
一、創建django程式
- 終端命令:
- django-admin startproject sitename IDE創建django程式時,本質上都是自動執行上述命令
其他常用命令:進入工程目錄
python manage.py runserver 127.0.0.1 埠號 運行測試
python manage.py startapp appname 添加app
python manage.py makemigrations
python manage.py migrate 上兩個命令一起使用,載入資料庫 -
python manage.py createsuperuser 創建superuser
二、程式目錄 添加app後的目錄(請忽略名字......)
三、配置文件 settings.py
1、資料庫
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'xxx', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } } # 由於Django內部連接MySQL時使用的是MySQLdb模塊,但python3中沒有此模塊,所以需要使用pymysql來代替 # 在上圖與項目名相同的文件中的__init__.py 文件中添加 import pymysql pymysql.install_as_MySQLdb()配置資料庫
2、靜態文件
1 STATICFILES_DIRS = ( 2 os.path.join(BASE_DIR,'static'), 3 )
路由系統
1、單一路由
1 urlpatterns = [ 2 path('xxx/', views.xxx), 3 ]
2、正則路由
1 re_path('^(\w+)/(\w+)/download/(\d+)$', views.download,), 2 re_path('^(\w+)/(\w+)/downloads/(\d+)/(?<id>\d+)$', views.downloads,) ,
3 #為防止衝突,儘量加上^和$
3、額外的參數
1 re_path('^(\w+)/(\w+)/downloads/(\d+)/(?<id>\d+)$', views.downloads,{‘id’:11}), 2 # 用的不多
4、為路由映射設置名稱
1 path('xxx/', views.xxx, name='xxx'),
2 # 同正則
設置名稱之後,可以在不同的地方調用,如:
- 模板中使用生成URL {% url 'xxx' 參數 %}
- 函數中使用生成URL reverse('xxx', args=(參數,)) from django.urls import reverse
- Model中使用獲取URL 自定義get_absolute_url() 方法
-
1 class NewType(models.Model): 2 caption = models.CharField(max_length=16) 3 4 5 def get_absolute_url(self): 6 """ 7 為每個對象生成一個URL 8 應用:在對象列表中生成查看詳細的URL,使用此方法即可!!! 9 :return: 10 """ 11 # return '/%s/%s' % (self._meta.db_table, self.id) 12 # 或 13 from django.urls import reverse 14 return reverse('NewType.Detail', kwargs={'nid': self.id})
# 獲取請求匹配成功的url:request.resolver_match
5、路由分發
path('
^xx/'
,include(
'xx.urls'
)), # from django.urls import include
路由系統
1、模版執行
#一般用的是這三個 from django.shortcuts import render, HttpResponse, redirect def xxx(request): ... return render(request, '模板路徑', [傳到前端的參數{key:value,...}]) # return redirect('路徑') # 重定向 # return HttpResponse('傳到前端的內容') # 其本質都是HttpResponse 看源碼
2、模版語言
- {{ item }}
- {% for item in item_list %} {{ item }} {% endfor %}
forloop.counter
forloop.first
forloop.last - {% if ordered_warranty %} {% else %} {% endif %}
- 母板:{% block title %}...{% endblock %}
子板:{% extends "base.html" %}
{% block title %}...{% endblock %}
3、simple_tag
# 在app中創建templatetags模塊 # 創建文件 xx.py #!/usr/bin/env python #coding:utf-8 from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def my_simple_time(參數): return ... @register.simple_tag def my_input(id,arg): result = "<a href='#'></a>" return mark_safe(result) # return內容即渲染內容 # 在使用simple_tag的html文件中導入之前創建的 xx.py 文件名 {% load xx %} #使用simple_tag {% my_simple_time [參數]%} {% my_input %} 可直接傳入render() 傳來的參數流程
流程走完無法使用???
django 還不知道去哪裡載入simple_tag
so 需要告訴它怎麼找
在settings中配置app
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'xxxapp.apps.xxxappConfig', 'xxxapp.templatetags', ] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], 'libraries': { 'my_tags': 'xxx.templatetags.my_tags', 'src_tags': 'xxxapp.templatetags.src_tags', 'stu_tags': 'xxxx.templatetags.stu_tags', } }, }, ] 更多:https://docs.djangoproject.com/en/1.10/ref/templates/language/
中間件
django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中間件中相應的方法。
在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變數,其中每一個元素就是一個中間件。
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'xxx.middleware.xx.Authentication' ] # 在根項目文件夾中xxx/middleware的xx.py文件中Authentication類 process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response) 以上方法的返回值可以是None和HttpResonse對象,如果是None,則繼續按照django定義的規則向下執行,如果是HttpResonse對象,則直接將該對象返回給用戶。
自定義中間件
class xxxx(object): def process_request(self,request): pass def process_view(self, request, callback, callback_args, callback_kwargs): i =1 pass def process_exception(self, request, exception): pass def process_response(self, request, response): return response
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'xxx.middleware.xx.xxxx'
]
admin
由django提供的後臺管理系統
# 創建superuser python manage.py createsuperuser #文章開頭 # models.py 中添加表 文章開頭命令載入資料庫 class Customer(models.Model): name = models.CharField(max_length=32, blank=True, null=True) qq = models.CharField(max_length=64, unique=True) phone = models.CharField(max_length=64, blank=True, null=True) email = models.EmailField(verbose_name='常用郵箱', blank=True, null=True) status_choices = ((0, '已購買'), (1, '未購買')) status = models.SmallIntegerField(choices=status_choices, default=0) product = models.ForeignKey('Product', on_delete=models.CASCADE) consultant = models.ForeignKey('UserProfile', on_delete=models.CASCADE) tag = models.ManyToManyField('Tag') date = models.DateTimeField(auto_now_add=True) # 自動添加 def __str__(self): return '{},{}'.format(self.qq, self.name) class Meta: verbose_name = '客戶' verbose_name_plural = '客戶' 在admin.py 中配置 from django.contrib import admin # Register your models here. class CustomerAdmin(admin.ModelAdmin): flist_display = ('id', 'name', 'qq', 'date', 'consultant') # 展示欄位 list_filter = ('date',) # 檢索 search_fields = ('qq', 'name') # 搜索 raw_id_fields = ('consultant',) #對fk可直接編輯多個 filter_horizontal = ('tag',) # manytomany 的覆選框 list_editable = ('consultant',) # 設置可編輯欄位 list_per_page = 5 # 每一頁顯示條數 readonly_fields = ('qq',) #只讀欄位 readonly_table = False # 只讀表 admin.site.register(models.Customer, CustomerAdmin) admin.site.register(models.Product)
更多:http://docs.30c.org/djangobook2/chapter06/