1. 程式人生 > >02 Django框架基礎(APP的創建訪問)

02 Django框架基礎(APP的創建訪問)

管理 小數位 edate 服務 rar tinc primary 建表 .cn

一、創建項目

1.命令:django-admin startproject sitename

2.IDLE環境:本質上都是執行上述命令

常用命令:

  python manage.py runserver 0.0.0.0 (啟動服務)
  python manage.py startapp appname (創建一個Application)
  python manage.py syncdb()
  python manage.py makemigrations()
  python manage.py migrate()

二、創建APP(application)

1.命令:dos下進入項目目錄執行:python manage.py startapp web(app名稱)

2.工具:pycharm 工具欄【Tools】-->Run manage.py task(點擊)在界面輸入:startapp web(app名稱)

django目錄(django的模式是MTV):

技術分享

新建的APP目錄缺少Template,可以使用公共的templates目錄,也可根據自己的實際需要新建

三、啟動

命令行:python manage.py runserver 0.0.0.0:9000(監聽所有地址,監聽端口9000)

技術分享

pycharm:pycharm 工具欄【Tools】-->Run manage.py task(點擊)在界面輸入:runserver 0.0.0.0:8000

四、服務器訪問

技術分享

五、寫一個最簡單的hello,world頁面

技術分享
from django.shortcuts import render
#導入httpresponse請求模塊
from django.http import  HttpResponse
# Create your views here.

#登錄頁面
def index(request):
    return HttpResponse(<h1>Hello felix</h1>)
web\views.py 技術分享
from django.conf.urls import url
from django.contrib import admin
from web.views import
index urlpatterns = [ url(r^admin/, admin.site.urls), #url映射 url(r^index/, index), ]
項目名稱\urls.py

六、不用重啟訪問

技術分享

七、動態路由

技術分享

技術分享
1、每個路由規則對應一個view中的函數
url(r^index/(\d*), views.index),
url(r^manage/(?P<name>\w*)/(?P<id>\d*), views.manage),
url(r^manage/(?P<name>\w*), views.manage,{id:333}),
2、根據app對路由規則進行一次分類
url(r^web/,include(web.urls)),
相關代碼

八、簡潔的動態路由(通過反射機制)

技術分享
django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其他大部分的Web框架則是對一類的url請求做一條路由映射,從而是路由系統變得簡潔
為什麽要簡潔

九、數據庫的連接訪問(模型相關)

1.數據庫配置

技術分享
DATABASES = {
    default: {
    ENGINE: django.db.backends.mysql,
    NAME:test,
    USER: felix,
    PASSWORD: 123456,
    HOST: 192.168.189.132,
    PORT: 3306,
    }
}
settings.py

2.Codefist實現

1).創建數據庫

2).配置文件settings.py連接數據庫

 3).創建model,繼承自modes.Model類:

技術分享
from django.db import models
 
class userinfo(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    memo = models.TextField()
創建model 技術分享
1、models.AutoField  自增列 = int(11)
  如果沒有的話,默認會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須將給列設置為主鍵 primary_key=True。
2、models.CharField  字符串字段
  必須 max_length 參數
3、models.BooleanField  布爾類型=tinyint(1)
  不能為空,Blank=True
4、models.ComaSeparatedIntegerField  用逗號分割的數字=varchar
  繼承CharField,所以必須 max_lenght 參數
5、models.DateField  日期類型 date
  對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次創建添加,之後的更新不再改變。
6、models.DateTimeField  日期類型 datetime
  同DateField的參數
7、models.Decimal  十進制小數類型 = decimal
  必須指定整數位max_digits和小數位decimal_places
8、models.EmailField  字符串類型(正則表達式郵箱) =varchar
  對字符串進行正則表達式
9、models.FloatField  浮點類型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  長整形
  integer_field_ranges = {
    SmallIntegerField: (-32768, 32767),
    IntegerField: (-2147483648, 2147483647),
    BigIntegerField: (-9223372036854775808, 9223372036854775807),
    PositiveSmallIntegerField: (0, 32767),
    PositiveIntegerField: (0, 2147483647),
  }
12、models.IPAddressField  字符串類型(ip4正則表達式)
13、models.GenericIPAddressField  字符串類型(ip4和ip6是可選的)
  參數protocol可以是:both、ipv4、ipv6
  驗證時,會根據設置報錯
14、models.NullBooleanField  允許為空的布爾類型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  減號、下劃線、字母、數字
18、models.SmallIntegerField  數字
  數據庫中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正則表達式
22、models.BinaryField  二進制<br>23、models.ImageField   圖片<br>24、models.FilePathField 文件
更多model字段 技術分享
1、null=True
  數據庫中字段是否可以為空
2、blank=True
  django的 Admin 中添加數據時是否可允許空值
3、primary_key = False
  主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列
4、auto_now 和 auto_now_add
  auto_now   自動創建---無論添加或修改,都是當前操作的時間
  auto_now_add  自動創建---永遠是創建時的時間
5、choices
GENDER_CHOICE = (
        (uM, uMale),
        (uF, uFemale),
    )
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default  默認值
8、verbose_name  Admin中字段的顯示名稱
9、name|db_column  數據庫中的字段名稱
10、unique=True  不允許重復
11、db_index = True  數據庫索引
12、editable=True  在Admin裏是否可編輯
13、error_messages=None  錯誤提示
14、auto_created=False  自動創建
15、help_text  在Admin中提示幫助信息
16、validators=[]
17、upload-to
更多字段參數 技術分享
一對多,models.ForeignKey(ColorDic)
一對一,models.OneToOneField(OneModel)
多對多,authors = models.ManyToManyField(Author)
應用場景:
一對一:在某表中創建一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了)。
例如:原有含10列數據的一張表保存相關信息,經過一段時間之後,10列無法滿足需求,需要為原來的表再添加5列數據。
一對多:當一張表中創建一行數據時,有一個單選的下拉框(可以被重復選擇)。
例如:創建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
多對多:在某表中創建一行數據是,有一個可以多選的下拉框。
例如:創建用戶信息,需要為用戶指定多個愛好。
庫中表與表的關系

4).python manage.py makemigrations ; python manage.py migrate

技術分享
class UserInfo(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    gender = models.BooleanField(default=False)
    age = models.IntegerField(default=19)
    memo = models.TextField(default=xxx)
    createdate = models.DateTimeField(default=2017-09-30)
models.py模型增加數據庫操作,新建表 技術分享
執行遇到的錯誤解決:
錯誤:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb.
Did you install mysqlclient or MySQL-python?
解決(python3.6 連接mysql數據庫):
參考:http://www.cnblogs.com/hank-chen/p/6624299.html
由於 MySQLdb 模塊還不支持 Python3.x,所以 Python3.x 如果想連接MySQL需要安裝 pymysql 模塊。
pymysql 模塊可以通過 pip 安裝。但如果你使用的是 pycharm IDE,則可以使用 project python 安裝第三方模塊。
[File] >> [settings] >> [Project: python] >> [Project Interpreter] >> [Install按鈕]

此時django要想訪問數據庫?在__init_.py下增加以下內容:
import pymysql
pymysql.install_as_MySQLdb()
No module named ‘MySQLdb‘  

技術分享 技術分享

5).修改model(增、刪、改、查)

技術分享
增加:創建實例,並調用save
更新:a.獲取實例,再sava;b.update(指定列)
刪除:a. filter().delete(); b.all().delete()
獲取:a. 單個=get(id=1) ;b. 所有 = all()
過濾:filter(name=xxx);filter(name__contains=‘‘);(id__in = [1,2,3]) ;
icontains(大小寫無關的LIKE),startswith和endswith, 還有range(SQLBETWEEN查詢)gt, in, isnull, endswith, contains, lt, startswith, iendswith, icontains,range, istartswith
排序:order_by("name") =asc ;order_by("-name")=desc
返回第n-m條:第n條[0];前兩條[0:2]
指定映射:values
數量:count()
聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max(guest_id))
原始SQL
cursor = connection.cursor()
cursor.execute(‘‘‘SELECT DISTINCT first_name ROM people_person WHERE last_name = %s""", [‘Lennon‘])
row = cursor.fetchone() 
表的增刪改查 技術分享
"""oldboy08day11 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r‘^$‘, views.home, name=‘home‘)
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r‘^$‘, Home.as_view(), name=‘home‘)
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r‘^blog/‘, include(‘blog.urls‘))
"""
from django.conf.urls import url
from django.contrib import admin
from web.views import index,login,list,add,delete,piliang_update,update,get

#路由系統
urlpatterns = [

    url(r^admin/, admin.site.urls),

    #url映射,url對應函數
    url(r^index/, index),
    url(r^login/, login),
    #動態的URL(配合正則表達式)
    # url(r‘^list/(\d*)‘, list),
    # url(r‘^list/(\d*)/(\d*)‘, list1),
    url(r^add/(?P<name>\d*)/, add),
    url(r^delete/(?P<id>\d*)/, delete),
    url(r^update/(?P<id>\d*)/(?P<hostname>\w*)/$, update),
    url(r^piliang_update/(?P<id>\d*)/(?P<hostname>\w*)/$, piliang_update),
    url(r^get/(?P<hostname>\w*)/$, get),

]
代碼:web\urls.py 技術分享
from django.shortcuts import render
#導入httpresponse請求模塊
from django.http import  HttpResponse
#對數據庫表進行操作
from web.models import Asset
# Create your views here.

#登錄頁面
def index(request):
    return HttpResponse(<h1>Hello World!!!</h1>)

def login(request):
    return HttpResponse(<h1>Hello World!!!</h1>)

def list(request,id):
    print(id)
    return HttpResponse(<h1>list</h1>)

#對數據庫表進行操作
def add(request,name):
    Asset.objects.create(hostname=name)
    return HttpResponse(add ok)

#刪除
def delete(request,id):
    Asset.objects.get(id=id).delete()
    return HttpResponse(delete ok)
#修改
def update(request,id,hostname):
    obj = Asset.objects.get(id=id)
    obj.hostname = hostname
    obj.save()
    return HttpResponse(update ok)
#批量修改
def piliang_update(request,id,hostname):
    Asset.objects.filter(id__gt=id).update(hostname=hostname)
    return HttpResponse(piliang_update ok)

#模糊查找
def get(request,hostname):
    assetlist = Asset.objects.filter(hostname__contains=hostname)
    print(assetlist)
    return HttpResponse(GET ok)

#需求一、獲取所有的數據 (通過filter id>0)
#方法一:
def get_all(request,hostname):
    assetlist = Asset.objects.filter(id__gt=0)
    print(assetlist) #界面暫時無法不顯示,先打印分析
    return HttpResponse(GET_all ok)
#方法2:
def get_alldata(request,hostname):
    assetlist = Asset.objects.all()
    assetlist = Asset.objects.all().values(id) #取某一個字段
    print(assetlist) #界面暫時無法不顯示,先打印分析
    print(assetlist.query) #打印select語句
    return HttpResponse(get_alldata ok)
#需求二、獲取所有數據的前兩行
def get_alldata_2row(request,hostname):
    assetlist = Asset.objects.all()[0:2]
    print(assetlist) #界面暫時無法不顯示,先打印分析
    return HttpResponse(get_alldata_2row ok)

#需求三、排序
def get_alldata_orderby(request,hostname):
    assetlist = Asset.objects.all().order_by(-id) #橫杠指倒敘
    print(assetlist) #界面暫時無法不顯示,先打印分析
    return HttpResponse(get_alldata_orderby ok)
代碼:web\views.py 技術分享
from django.db import models

# Create your models here.


class UserInfo(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    gender = models.BooleanField(default=False)
    age = models.IntegerField(default=19)
    memo = models.TextField(default=xxx)
    createdate = models.DateTimeField(default=2017-09-30)

#字段參數
class Args(models.Model):
    name = models.CharField(max_length=20,null=True)
    not_name = models.CharField(max_length=30,null=False)

#通過auto_now等參數,以後數據新增更新的時候系統會自動補時間
class Asset(models.Model):
    hostname = models.CharField(max_length=256)
    create_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(auto_now=True)

#會自動為usertype自動不填1,2,3,
class Temp(models.Model):
    GENDER_CHOICE = ((u1,u普通用戶),(u2,u管理員),(u3,u超級用戶))
    usetype= models.CharField(max_length=2,choices=GENDER_CHOICE)
代碼:web\modes.py

6). 改完後在執行4即可

十、模板

1.運行流程圖理解

技術分享

技術分享
模板中也有自己的語言,該語言可以實現數據展示

{{ item }}

{% for item in item_list %}  
    <a>{{ item }}</a> 
{% endfor %}

  forloop.counter
  forloop.first
  forloop.last 
{% if ordered_warranty %}  
{% else %} 
{% endif %}
母板:{% block title %} {% endblock %}
子板:{% extends "base.html" %}
   {% block title %} {% endblock %}
幫助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}
模板語言 技術分享
a、在app中創建templatetags文件夾

b、創建任意 .py 文件,如:xxx.py
#!/usr/local/bin/python3
#-*-coding:utf-8 -*-
#Author:Felix Song ;Environment:pycharm 5.0.3(python3.6)

from django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable, Node, TemplateSyntaxError
 
register = template.Library()
 
@register.simple_tag
def my_method(v1):
    return  v1*1000
 
@register.simple_tag
def my_input(id,arg):
    result = "<input type=‘text‘ id=‘%s‘ class=‘%s‘ />" %(id,arg,)
    return mark_safe(result)
c、在使用自定義simple_tag的html文件中導入之前創建的 xx.py 文件名,放置位置如下
<!DOCTYPE html>
{% load xxx %} 
<html lang="en">

d、使用simple_tag(多個參數可用空格隔開)
{% 幫助方法名稱 參數 %}
{% my_input id_username hide%}

e、再settings中配置當前app,不然django無法找到自定義的simple_tag
INSTALLED_APPS = (
    django.contrib.admin,
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles,
    自己的APP名稱,
)
通過simple_tag實現模版語言中的幫助方法

2.子母板運用:

技術分享

技術分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主頁面</title>
</head>
<body>
    <div>公用的頭部</div>
    <div>
        {% block content %}

        {% endblock %}
    </div>
    <div>公用的底部</div>
</body>
</html>
母版:base.html 技術分享
{% extends base.html %}
{% block content %}
 {# 將定義的用戶數據傳入#}
    <h1>{{ user }}</h1>
    {#將數據庫獲取的數據傳入#}
    <table border="2" >
        {#運用模板#}
        {% for item in data %}
             <tr>
                <td>{{  item.id }}</td>
                {#<td>{%  my_method item.id %}</td>#}
                <td>{{ item.hostname }}</td>
                <td>{{ item.create_date|date:"Y-m-d H:i:s" }}</td>
                <td>{{ item.update_date|date:"Y-m-d H:i:s" }}</td>
            </tr>
        {% endfor %}
    </table>
     {% if user %}
            <h1>真</h1>
        {% else %}
            <h1>假</h1>
        {% endif %}
{% endblock %}
子版:index.html

3.幫助方法:

技術分享
{% extends base.html %}
{% block content %}
{% load help_method %}
 {# 將定義的用戶數據傳入#}
    <h1>{{ user }}</h1>
    {#將數據庫獲取的數據傳入#}
    <table border="2" >
        {#運用模板#}
        {% for item in data %}
             <tr>
{#                <td>{{  item.id }}</td>#}
                <td>{%  my_method item.id %}</td>
                <td>{{ item.hostname }}</td>
                <td>{{ item.create_date|date:"Y-m-d H:i:s" }}</td>
                <td>{{ item.update_date|date:"Y-m-d H:i:s" }}</td>
            </tr>
        {% endfor %}
    </table>
     {% if user %}
            <h1>真</h1>
        {% else %}
            <h1>假</h1>
        {% endif %}
{% endblock %}
templates\index.html(子版) 技術分享
#!/usr/local/bin/python3
#-*-coding:utf-8 -*-
#Author:Felix Song ;Environment:pycharm 5.0.3(python3.6)

from django import template
from django.utils.safestring import mark_safe
# from django.template.base import resolve_variable, Node, TemplateSyntaxError

register = template.Library()
@register.simple_tag
def my_method(v1):
    return  v1*1000
zyxt\templatestags\help_method.py

執行幫助方法前的效果:

技術分享

執行幫助方法後的效果:

技術分享

參考:

http://www.cnblogs.com/wupeiqi/articles/4491246.html

http://www.cnblogs.com/wupeiqi/articles/5237672.html

02 Django框架基礎(APP的創建訪問)