Django基礎(二)

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)
View Code

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',
        },
    }
}
View Code

之後只要執行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 

相關文章
相關標籤/搜索