url配置系統html
1.無名分組python
urlpatterns = [ url(r'admin/', admin.site.urls), url(r'^blog/article/(\d+)/$', blog_views.article_year), url(r'^blog/article/(\d+)/(\d+)$', blog_views.article_yearMonth), ]
def article_year(request, year): return HttpResponse(str(year)) def article_yearMonth(request, year, month): return HttpResponse('OK'+year+month)
2.有名分組mysql
url(r'^blog/article/(?P<year_id>\d+)/(?P<month_id>\d+)$', blog_views.article_yearMonth),
def article_yearMonth(request, year_id, month_id): return HttpResponse('OK'+year_id+month_id)
3.路由分發git
根據app進行url分發,目的是解耦sql
from django.conf.urls import url,include urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('blog.urls')), ]
#blog\urls.py from blog import views as blog_views urlpatterns = [ url(r'article/(\d+)$, blog_views.article_year'), url(r'^article/(\d+)/(\d+)$', blog_views.article_yearMonth), ]
4.url反向解析數據庫
urlpatterns = [ url(r'^blog/', include('blog.urls')), url(r'^login.html/', app01_views.login, name='LOGIN') ]
#app01\views.py def login(request): if request.method == 'POST': user=request.POST.get('user') pwd=request.POST.get('pwd') return HttpResponse('登錄成功') return render(request, 'login.html')
#login.html <form action='{% url 'LOGIN' %}' method='post'> <p>姓名 <input type='text' name='user'/></p> <p>密碼 <input type='password' name='pwd'/></p> <input type='submit'> </form>
視圖函數django
1.請求對象app
request(請求對象):ide
request.GET ---- get請求數據函數
request.POST ---- post請求數據
request.method ---- 請求方式
request.path ---- 請求路徑
request.get_full_path() ---- 請求全路徑
request.getlist() ---- 請求數據(涉及到select等多選的屬性時用到,select中須要寫上multiple)
2.響應對象
HttpResponse()
render(request,template_name,context)
template:模板
context:上下文
redirect(跳轉,重定向)
redirect('/路徑/')
模擬點擊submit請求:
請求url:http://127.0.0.1:8000/login/
(1)請求url:/login/ POST
(2)url(r'^login', app01_views.login, name='LOGIN'),
(3)llogin(request): 驗證, if 成功: redirect('/index/')
重定向請求:
請求路徑:http://127.0.0.1:8000/index/
(1)/index/ GET
(2)url(r'index/', app01_views, name='index')
(3)index(request): 從數據庫取出數據,渲染到index.html頁面
用戶看到的是:渲染好的index.html頁面
模板語法
功能:爲了更有邏輯的將數據庫中的數據渲染到模板中
1.渲染變量
變量:{{ }}
深度查詢: 句點符.
標籤:{% %}
{% for i in obj %}{% endfor %}
{% if n > 20 %}{% else %}{% endif %}
{% for i in obj %}{% empty %}<p>沒有</p>{% endfor %}
2.變量過濾器
{{ var|filter_name:參數 }}
{{ age|add:10 }}:值在原來的基礎上加10
{{ date|date:"Y-m-d" }}:輸出的時間格式改變
{{ value|default:'值爲空' }}:從數據庫沒法取到數據時,這樣顯示更友好
{{ value|length }}:顯示長度
{{ value|slice:"2:-1" }}:截取
{{ value|truncatechars:"20" }}:按照字符截斷
{{ value|truncatewords:"4" }}:按照單詞截斷
{{ value|safe }}:對HTML和JS標籤不進行自動轉義
3.自定義過濾器和標籤
a.在settings中的INSTALLED_APPS配置當前app,
b.在app中建立templatetags模塊
c.在templatetags模塊中建立任意.py文件,如:my_tag.py
from django import template from django.utils.safestring import mark_safe register=template.Library() @register.filter def filter_multi(v1, v2): return v1*v2 @register.simple_tag def simple_tag_multi(v1, v2): return v1*v2 @register.simple_tag def my_input(id, arg): result="<input type='text' id='%s' class='%s'>" % (id, arg,) return mark_safe(result)
d.在使用自定義simple_tag和filter的html文件中導入建立的my_tag.py
{% load my_tag %}
e.使用simple_tag和filter
{{ num|filter_multi:12 }}
{% multi_tag n 5 2 %}
{% if num|multi:10 > 100 %}{% else %}{% endif %}
區別:
a.自定義的filter只能接受兩個參數
b.自定義的simple_tag不能與if使用
4.繼承
{% extends "base.html" %} ---> 繼承母版
{% block content %}My amazing blog{% endblock %} ---> 編寫擴展內容
{{ block.super }} --> 繼續引用父類的內容
ORM系統
映射關係
表名 <----> 類名
字段 <----> 屬性
表記錄 <----> 類實例對象
#models.py class Book(models.Model): id=models.AutoField(primary_key=True) title=models.CharField(max_length=32) pubDate=models.DateField() price=models.DecimalField(max_digits=6,decimal_places=2) publish=models.CharField(max_length=32)
python manage.py makemigrations
python manage.py migrate
數據庫引擎更改:
MYsqlDB--->pymysql
在應用的__init__文件中加入:
import pymysql
pymysql.install_as_MySQLdb()
單表操做:
插入數據方式1:create有返回值---插入的記錄對象
book_obj=models.Book.objects.create(title=title,pubDate=pubdate,price=price,publisher_id=publish_id)
print(book_obj.title)
print(book_obj.price)
插入數據方式2:
book_obj=models.Book.objects.create(title=title,pubDate=pubdate,publish=publish)
book_obj.price=price
book_obj.save()
ORM表關係:
一對多:
一對多添加
關聯字段放在多的一方
# 添加數據方式1
publish_obj=models.Publish.objects.get(name='renmin')
book_obj=models.Book.objects.create(title='python',price=122,pubDate='2012-12-12',publisher=publish_obj)
# 添加數據方式2
book_obj=models.Book.objects.create(title='python',price=122,pubDate='2012-12-12',publisher_id=publish_obj.id)
book_obj=models.Book.objects.create(title='python',price=122,pubDate='2012-12-12',publisher_id=2)
# 添加數據方式3
obj=models.Book(title='python',price=122,pubDate='2012-12-12',publisher=publish_obj)
obj.save()
一對多查詢
book_python=models.Book.objects.filter(title="python").first()
print(book_python.title)
print(book_python.price)
print(book_python.publisher) # Publish object :返回的是與這本書關聯的出版社對象
print(book_python.publisher.name)
多對多:
建立第三張表
一對一:
關聯字段能夠放在兩張表的任意一張,關聯字段必須惟一約束
ORM查詢API:
a. models.Book.objects.all() --> 查詢所有,返回queryset
b. booklist=models.Book.objects.filter(price=134,title='數學書') --> 過濾,返回queryset # [obj1,]
c. book_obj=models.Book.objects.get(title='數學書') ---> 返回model對象,也就是類對象。沒有必要經過索引取值,print(book_obj.title),
並且get()括號中取出的值必須惟一,返回結果有且只能有一個,多了就會報錯,因此get後面用通常用id來作,保證惟一性,models.Book.objects.get(id=11)
d. 若是返回的是queryset,就能夠調用first(),last()
book_obj1=models.Book.objects.all().first().first()
print(obj.title)
book_obj2=models.Book.objects.filter(price=134).last()
e. book_obj=models.Book.objects.exclude(price=134) 與filter()相反,過濾出不符合條件的QuerySet [obj1,obj2,]
for book in book_obj:
print(book.title)
f. count:返回對象的個數
count=models.Book.objects.exclude(price=134).count()
print(count)
g. order_by()
book_list=models.Book.objects.all().order_by("price")
for i in book_list:
print(i.title, i.price)
從大到小排列
book_list=models.Book.objects.all().order_by("-price")
h. reverse()反轉
book_list=models.Book.objects.all().order_by("-price").reverse()
i. values(),存的是字典
rel=models.Book.objects.all().values(「title」) 返回QuerySet,裏面是一個個的字典 [{},{},]
print(rel) # <QuerySet [{'title':'語文書'},{'title':'數學書'},{'title':'英語書'},{'title':'物理書'}]>
j. values_list(),存的是元組
rel=models.Book.objects.all().values_list(「title」)
print(rel) # <QuertSet [('語文書',),('數學書',),('英語書',)]>
k. exist(),判斷是否有值,有值後再作其餘操做
ret=models.Book.objects.all().exist()
if ret:
print('OK')
else:
print('NO')
單表查詢之雙下劃線:
首先在settings裏面加入以下配置:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
之後只要執行ORM操做,sql語句就會打印出來
模糊查詢:
book_list=models.Book.objects.filter(id__get=8) # id>8的輸出出來,返回的是QuerySet
print(book_list.count())
book_list2=models.Book.objects.filter(title__startswith='語')
print(book_list[0].title)
book_list3=models.Book.objects.filter(title__icontains='py')
print(book_list[0].title)
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id>1且id<10的值
models.Tb1.objects.filter(id__in=[11, 22, 33]) #獲取id等於11,22,33的數據
models.Tb1.objects.filter(id__range=[1, 2]) # 範圍 between and