url路由、模板語言、ajax、用django框架創建表


1、后台管理的左側菜單,默認只有第一個頁簽下面的選項是顯示的,點了別的頁簽再顯示別的頁簽下面的選項,問題是:點了任何菜單的選項后,左側菜單又成了第一個頁簽的選項顯示,別的頁簽隱藏,也就是左側的菜單刷新了一遍。

2、登錄頁面,用戶輸入了用戶名和密碼,點了登錄,如果輸入的是錯誤的,則當前頁面會刷新一遍(提交后就會刷新),用戶已經輸入的內容就全沒有了;這需要用到ajax實現靜默提交。

3、登錄網址是login.html,后台管理網址是index.html,如果用戶不進入login.html而直接進入index.html的話,事實上用戶就不用登錄即可訪問后台了;這需要用會話保持做限制(cookie、session),如果沒有保存登錄信息,輸入index.html會自動跳轉到login.html。

1.路由系統

1.1 簡單描述

django的每個url都對應一個python方法,

,比如用戶輸入的網址是127.0.0.1:8000/login,則django會默認從urls.py里配置的url,從上到下匹配,有匹配成功的,就執行對應方法,下面的就不匹配了;沒有匹配的,就返回404。

1.2 使用正則表達式配置url

,這些數字頁簽,每一個都對應一個url,比如有1000頁,是不是也要在urls.py里寫一千個路由記錄?並不是,而是用正則表達式,見下,

urls.py,

# 使用正則表達式
url(r'^detail/(\d+)/' ,views.detail)

views.py,

# 如果urls.py里的url是兩個值,比如/detail/123/那么對應的函數必須接收兩個參數,如下,一個request,一個nid,不然會報錯。
def detail(request,nid):
    print(nid)
    return render(request,'back.html')

根據取到的這個nid,就可以去數據庫里取數據了,比如第一頁取前十條數據,第二頁取11條-20條數據。

1.3 url設置關鍵參數

urls.py,

urlpatterns = [
    #url(r'^admin/', admin.site.urls),
    url(r'^index/$', views.index),
    url(r'^back/$', views.back),
    url(r'^check/$', views.check),
    url(r'^detail/(\d+)/' ,views.detail),
#設置關鍵參數,“?P<n1>”
    url(r'^detail1/(?P<n1>\d+)/(?P<n2>\d+)' ,views.detail1),
]

views.py,

#n1、n2是取的關鍵參數
def detail1(request,n1,n2):
    print(n1,n2)
    return render(request,'back.html')

 2.實現分頁展示和查看詳情

urls.py,

urlpatterns = [
    url(r'^pageTest/(\d+)/$', views.pageTest),
    url(r'^details/(\d+)/$', views.details),
]

views.py,

from django.shortcuts import render
from django.shortcuts import redirect
from django.shortcuts import HttpResponse
from cmdb import models
# Create your views here.


user_list1 = []
for item in range(99):
    temp = {'id':str(item),'username':'zsc' + str(item),'email':'email' + str(item)}
    user_list1.append(temp)

def pageTest(request,page):
    #1,0-9
    #2,10-19
    #3,20-29

    page = int(page)
    startpoint = (page - 1) * 10
    endpoint = page * 10
    user_list = user_list1[startpoint:endpoint]
    return render(request,'page.html',{'user_list':user_list})

def details(request,nid):
    nid = int(nid)
    current_details = user_list1[nid]
    return render(request,'details.html',{'current_details':current_details})

details.html,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        <li>{{ current_details.id }}</li>
        <li>{{ current_details.username }}</li>
        <li>{{ current_details.email }}</li>

    </ul>
</body>
</html>

page.html,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table>
        <tr>
            <td>id</td>
            <td>username</td>
            <td>details</td>
        </tr>

        {% for item in user_list %}
            <tr>
                <td>
                    {{ item.id }}
                </td>

                <td>
                    {{ item.username }}
                </td>
                <td>
                    <a href="/details/{{ item.id }}" target="_blank">see the details</a>
                </td>

            </tr>
        {% endfor %}
    </table>
</body>
</html>

 

 3. 路由系統根據app分流

一個項目有很多個app,比如web是主站,manger是后台,那urls.py怎么配置更合理呢?答案是根據app來實現url分流處理,見下以web為例配置的urls.py,

項目里的urls.py,

from django.conf.urls import url,include
urlpatterns = [
#以web開頭的所有訪問都拋給web這個app下面的urls.py
    url(r'^web/',include('web.urls.py')),

]

在web這個app下面新建一個urls.py,

from web import views

urlpatterns = [
   url(r'^pageTest/(\d+)/$', views.pageTest),
   url(r'^details/(\d+)/$', views.details),     
]

這樣配置好后,比如訪問127.0.0.1:8000/web/pageTest/1,就會將這個url拋給web下面的urls.py里對應的函數處理。

這樣,monitor的url交給monitor處理,manager的url交給manger處理,更清晰。

4.模版語言之基本操作和filter

  ,如左面兩個圖所示,模板渲染的過程,其實就是把html轉化為python方法的過程,在python方法里新建一個列表,然后把常量值都append進去,遇到變量值的話,再獲取變量值然后append到列表里,最后將這些解析好的代碼拼接成一個html頁面,再return給用戶。

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

4.1 基本操作

urls.py,

urlpatterns = [
    url(r'^templateTest/$', views.templateTest),
]

templateTest.html,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>{{ k1 }}</p>
    <p>{{ k2 }}</p>
#根據下標取列表的值時,不能用“[]”,必須用“.”
    <p>{{ k2.0 }}</p>
    {% for item in d1 %}
# forloop.counter,從1開始依次輸出;
#  forloop.counter0,從0開始依次輸出;
#  forloop.first,判斷是否是第一個值,如果是就返回true
        <p>{{ item }},{{ forloop.counter }},{{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }},{{ forloop.revcounter }}</p>
    {% endfor %}

    {% if k1 == 'v1' %}
        <h1>v1</h1>
        {% elif k1 == 'v2' %}
            <h1>v2</h1>
    {% else %}
        <h1>77777</h1>
    {% endif %}

</body>
</html>

 

views.py,

def templateTest(request):
    return render(request,'templateTest.html',{'k1':'v2','k2':[11,22,33],'d1':{'kk1':'vv1','kk2':'vv2','kk3':'vv3'}})

4.2 模板內置方法

{{ item.event_start|date:"Y-m-d H:i:s"}},將時間格式化輸出
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }},將列表的第一個元素大寫
{{ name|lower }},將name的值小寫。

4.3 模板里自定義filter方法

模板里內置的方法略顯死板,所以還是有必要自己建模板方法的,步驟見下:

1、在app(這里說的app意思是小程序,並不是名字叫app)目錄下新建一個目錄“templatetags”,目錄名必須是這個,定死的;

2、在templatetags目錄下新建一個.py文件,比如說是tempTest.py,內容見下,

#下面兩行是必須導入的
from django import template
from django.utils.safestring import mark_safe

#這里的register、template.Library()都是固定的,不能改名!!!
register = template.Library()

#加上下面這個裝飾器后,這個python方法就變成了模板方法。
#這個filter裝飾器最多接收兩個參數,第一個參數必須有,第二個參數可有可無;后面講的simple_tag的裝飾器支持多個參數。
#如果想用filter處理多個參數怎么辦?可以將多個字符串當成一個值傳給函數,然后再做切片處理,如{{ k1 | f1:"zsc,aqq" }}
@register.filter()
def f1(v1,arg):
    return v1 + "666" + arg

 

 

3、在html中引入模板方法,

    

{% load tempTest %}
#我們一般在第一行引入模板方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
#調用模板方法並傳參數
    {{ k1|f1:"zsc" }}
</body>
</html>

 

4、使用模板方法

{{ k1|f1 }}
#f1是tempTest.py里的方法

5、在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的名稱是app01
    'app01',
)

 5. 模版語言之simple_tag

5.1 創建simple_tag模板語言

from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.simple_tag
def f2(s1,s2,s3,s4):
    return s1 + s2 + s3 + s4
在html里調用方式:
{% f2 "zsc" "1" "anqingqing" "xiaoxixi" %}

5.2 filter和simple_tag對比

filter:

  限制參數個數;

  支持作為模板語言if判斷的條件,也就是可以用{% if k1|filterfunc %}這種形式,如果funcone返回true,就為真,返回false就為假。

simple_tag:

  不限制參數個數;

  不支持作為模板語言if判斷的條件,也就是不能用{% if simple_tag_func arg1 %}這種形式,不論simple_tag_func返回true或false都沒作用。

下例為html中的模板語言將filter作為if判斷條件的例子:

testTemp.py:

from django import template
from django.utils.safestring import mark_safe

register = template.Library()
@register.filter
def f3(v1):
    if v1 == 'vvv':
        return True
    else:
        return False

templateTest.py:
{% if k1|f3 %}
<h1>true</h1>
{% else %}
<h1>false</h1>
{% endif %}

 6.模版語言之母板

網站后台的格局一般是header、body、footer,body的左邊是menu,右邊是content,一般header和footer都是不變化的,點擊menu里的選項后,比如點擊“用戶管理”,“用戶管理”變成被選中的樣式,同時右邊的content區域出來用戶的管理信息,點擊“服務器管理”,“服務器管理”變成被選中的樣式,同時右邊的content區域出來服務器的管理信息。這其實是在“用戶管理”和“服務器管理”上分別加了不同的url,跳轉到不同的頁面。這時候有個問題,跳轉到不同的url,這倆html頁面的header、footer都是不變化的,那用戶管.html和服務器管理.html都要重新寫一遍header和footer的內容嗎?答案是否定的。這時候就要用到母板,創建一個母板,然后子html頁面引用母板即可,就像導入python模塊似的,見下例,

urls.py,

urlpatterns = [
    url(r'^motherModel/$', views.motherModel),
    url(r'^userinfo/$', views.userinfo),
    url(r'^serverinfo/$', views.serverinfo),

]

views.py,

def motherModel(request):

    return render(request,'motherModel.html')

def userinfo(request):
    return render(request, 'userinfo.html', {'user_list': user_list1})

def serverinfo(request):
    return render(request, 'serverinfo.html')

motherModel.html,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        .page-header{
            width:100%;
            height:100px;
            background-color:red;
        }

        .page-body{
            min-height:400px;
        }

        .page-footer{
            width:100%;
            height:50px;
            background-color:green;
        }
        .menu{
            width:20%;
            float:left;
        }

        .content{
            width:80%;
            float:left;
        }
    </style>

</head>
<body>
    <div class="page-header">

    </div>

    <div class="page-body">
        <div class="menu">
            <ul>
                <li><a href="/userinfo/">userManage</a></li>
                <li><a href="/serverinfo/">serverManage</a></li>
            </ul>

        </div>

        <div class="content">
#可以定義多個block,content是當前block的名稱
            {% block content%}{%endblock%}
        </div>
    </div>

    <div class="page-footer">

    </div>
</body>
</html>

userinfo.html,

#導入母板html
{% extends "motherModel.html" %}

#這里也要寫上{% block content %},與母板里的block對應
{% block content %}
    <table>
        {% for item in user_list %}
            <li>{{ item.id }},{{ item.username }} ,{{ item.email }}</li>
        {% endfor %}
    </table>
{% endblock %}

serverinfo.html,

{% extends "motherModel.html" %}

{% block content %}
    <table>
        i am is a server,hello.
    </table>
{% endblock %}

 7.模板導入js

在上面的基礎上,加了一個點擊菜單后給菜單添加背景色效果。

templateModel.html,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        .page-header{
            width:100%;
            height:100px;
            background-color:red;
        }

        .page-body{
            min-height:400px;
        }

        .page-footer{
            width:100%;
            height:50px;
            background-color:green;
        }
        .menu{
            width:20%;
            float:left;
        }

        .content{
            width:80%;
            float:left;
        }

        .activego{
            background-color:green;
        }
    </style>

</head>
<body>
    <div class="page-header">

    </div>

    <div class="page-body">
        <div class="menu">
            <ul>
                <li><a id="userinfo" href="/userinfo/" class="usermanage">userManage</a></li>
                <li><a id="serverinfo" href="/serverinfo/">serverManage</a></li>
            </ul>

        </div>

        <div class="content">
            {% block content %}{% endblock %}
        </div>
    </div>

    <div class="page-footer">

    </div>

#此處導入一個js,使左側菜單點擊后添加背景
    {% block js %} {% endblock %}


</body>
</html>

userinfo.html,

{% extends "motherModel.html" %}

{% block content %}
    <table>
        {% for item in user_list %}
            <li>{{ item.id }},{{ item.username }} ,{{ item.email }}</li>
        {% endfor %}
    </table>
{% endblock %}


{% block js %}
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <script>
        $("#userinfo").addClass("activego")
    </script>
{% endblock %}

serverinfo.html,

{% extends "motherModel.html" %}

{% block content %}
    <table>
        i am is a server,hello.
    </table>
{% endblock %}

{% block js %}
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <script>
        $("#serverinfo").addClass("activego")
    </script>
{% endblock %}

 8.include小組件

html頁面有很多輸入框、展示框,可以用引入的方式避免代碼重復編寫,見下,

<body>
    <form>
        <input />
        <input />
        <input />
    </form>
</body>

等同於下面,
<body>
    {% include 'x.html' %}
    {% include 'x.html' %}
    {% include 'x.html' %}
</body>

x.html,
<form>
        <input />
        <input />
        <input />
    </form>

 9.Ajax使用(一)

網站的注冊登陸、網頁版微信QQ,以及幾乎所有的網站都在使用ajax,因為它可以做到不刷新頁面就把數據提交到后台,讓用戶無感知。試想,如果網頁版QQ,每發送一條信息都刷新一次網頁,那閃瞎了該。

正因為ajax的廣泛使用及重要,所以有必要詳細了解一下它。

這里我們會基於jquery來使用ajax,因為jquery支持ajax支持的非常好。

ajax示例

urls.py,

url(r'^ajaxTest/$', views.ajaxTest),

ajaxTest.html,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <input type="text" value="username"  id="username" name="username"/>
    </div>

    <div>
        <input type="password" value="password"  id="password" name="password"/>
    </div>

    <div>
        <input type="button" value="submit"  id="submit" onclick="submitClick();" />
    </div>

    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <script>
        function submitClick(){
            $.ajax({
#form里的action的鏈接可以不帶“/”,但是ajax里的url參數必須帶“/”
                    url: "/ajaxTest/",
                    type: "POST",

#將數據傳給上面的url
                    data:{'username':$('#username').val(),'password':$('#password').val()},

#data是上面的url的返回值
                    success:function(data){
                        if(data == '1') {
                           location.href = 'http://www.baidu.com';
                        }else{
                            alert('false');
                        }
                    }
                }
            )
        }
    </script>
</body>
</html>

 

 9.Ajax使用(二)

上面是根據返回的數值來判斷是否合法,如果返回1就合法,返回2就不合法。事實上前端開發和后端開發是分開的,也就是事先必須約定好,到底1是合適,還是2是合法,還是0是合法,所以如果前端人員想改規則,則必須告訴后端人員,雙方都需要改代碼,所以最好是用json來通信,見下面代碼,后端給前端返回一個包含狀態和報錯信息和的字典,然后前端取到狀態,根據狀態來決定做什么,

ajaxTest.html,

<script>
        function submitClick(){
            $.ajax({
                    url: "/ajaxTest/",
                    type: "POST",
                    data:{'username':$('#username').val(),'password':$('#password').val()},
                    success:function(data){
#將收到的序列化字符串,反序列化成字典
                        var data = JSON.parse(data)
                        if(data.status) {
                            location.href = 'http://www.baidu.com';
                        }else{
                            alert(data.message);
                        }
                    }
                }
            )
        }
    </script>

views.py,

import json
def ajaxTest(request):
    if request.method == 'POST':
        ret = {'status':False,'message':''}
        username = request.POST.get("username",None)
        password = request.POST.get("password",None)

        if username=='111' and password=='222':
            ret['status'] = True
            return HttpResponse(json.dumps(ret))
        else:
            ret['message'] = 'invalid username or password.'
            return HttpResponse(json.dumps(ret))
    return render(request,'ajaxTest.html')

 10. ajax進階

jquery沒有ajax功能,瀏覽器有一個模塊是來實現ajax功能的,jquery是調用瀏覽器的這個模塊,實現了ajax功能。瀏覽器包含一個XMLHttpRequest對象,正是用這個對象實現的ajax功能,jQuery通過調用XMLHttpRequest對象,封裝了一些功能,讓用戶能簡單的使用ajax。

如果是跨域名提交ajax請求,瀏覽器會做攔截,自己的瀏覽器能發到對端的瀏覽器,對端的瀏覽器也能返回數據,但是返回來的數據會被自己的瀏覽器攔截。解決辦法有兩個:jsonp和修改瀏覽器設置,遇到了再說吧。

11. Models創建數據庫表

from django.db import models

   
class userinfo(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    memo = models.TextField()

上面這個類就創建一個數據庫表userinfo,name字段的數據類型是CharField,可以存儲string類型數據;memo字段的數據類型是TextField;email字段的類型寫的是EmailField,對數據庫而言,沒有EmailField這個數據類型,它也是存儲string類型的數據,那為什么這里定義成EmailField呢,因為結合別的模塊使用時會有特殊功能,比如結合admin.py(admin.py自帶驗證功能)來用,如果是EmailField類型的,admin.py會自動檢測用戶輸入的內容是否符合郵箱格式。

11.1 更多字段

1、models.AutoField(primary_key=True)  自增列 = int(11)
  每個表默認會帶一個自增id的字段,如果要顯示的控制自增id字段,可以這樣,
    class userinfo(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=30)

2、models.CharField  字符串字段
  必須指定max_length 參數
3、models.BooleanField  布爾類型=tinyint(1)
  不能為空,Blank=True
4、models.ComaSeparatedIntegerField  用逗號分割的數字=varchar
  繼承CharField,所以必須指定max_lenght 參數。
    這個字段跟EmialField類似,對數據庫而言就是一個存儲string的字段而已,只是他要求用戶輸入的內容必須是以逗號分隔的數字,見下,
    11,223,32322。這樣的數字是合法的,不然會提示不合法。
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正則表達式);這個可能快過期了,在django1.10之后可能就不能用了,用下面的GenericIPAddressField代替。
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  字符串,地址正則表達式;對數據庫而言就是string,帶有URL驗證的功能。
22、models.BinaryField  二進制
23、models.ImageField   圖片;對數據庫而言就是個存儲string的字段,對amdin.py而言,會生成一個帶上傳功能的框,默認上傳到項目的根目錄。
24、models.FilePathField 文件;對數據庫而言就是個存儲string的字段,對amdin.py而言,會生成一個帶上傳功能的框

11.2 創建表(一對多)並啟用admin.py

admin.py提供了很強大的后台管理功能,下面簡單說一下,就能看出來它的方便和強大之處了。

urls.py,

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

models.py,

class UserType(models.Model):
    name = models.CharField(max_length=32)

#這個方法是為了讓admin頁面顯示出name的真實值,默認是顯示object.name
    def __str__(self):
        return self.name

class UserInfo(models.Model):
    user = models.CharField(max_length=32)
    passwd = models.CharField(max_length=32)

#由於email和memo和user_type都是新加的字段,也就是說本來有user和passwd字段,只有這倆字段的時候做過一次python manage.py makemigrations,新增了字段再python manage.py makemigrations,就會提示一些東西,所以必須給新增的字段加上null=True,表示數據庫允許該字段為空。
    email = models.EmailField(null=True)
    memo = models.TextField(null=True)
    # img = models.ImageField()

#設置外鍵;blank=True是允許admin頁面該項為空。
    user_type = models.ForeignKey("UserType",null=True,blank=True)

    def __str__(self):
        return self.user

admin.py,

from django.contrib import admin

# Register your models here.

from cmdb import models

#將表注冊到admin
admin.site.register(models.UserInfo)
admin.site.register(models.UserType)

更新數據表和創建超級用戶,

python manage.py makemigrations
python manage.py migrate

#這個只需要執行一次,創建的是登錄admin頁面的管理員用戶
python manage.py createsuperuser

userinfos 和user types就是我們創建的表,點擊add就能添加了。

11.3 創建表的多對多關系

方法一:

class Boy(models.Model):
    name = models.CharField(max_length=32)

    
class Girl(models.Model):
    name = models.CharField(max_length=32)
    
#加上這個后,就創建了Boy和Girl表的多對多關系。存儲多對多關系的這個表是不可見的,名稱就是Boy_Girl
    f = model.ManyToManyField(Boy)

方法二:

#主動創建一個表來存儲多對多關系
class B2G(models.Model):
    boy = models.ForeignKey('Boy')
    girl = models.ForeignKey('Girl')

class Boy(models.Model):
    name = models.CharField(max_length=32)

    
class Girl(models.Model):
    name = models.CharField(max_length=32)
    
    f = model.ManyToManyField(Boy)

11.4 創建一對一關系表

比如一個用戶表,一個用戶類型表,如果用戶表里的user_type值設置為unique,那其實就實現了一對一的關系,比如用戶張三的用戶類型是超級用戶,則不能再插入一個普通用戶的張三。

user_type = models.OneToOneField("UserType",null=True,blank=True)

11.5 更多參數

1、null=True,數據庫中字段是否可以為空
2、blank=True,django的Admin中添加數據時是否可允許空值
3、primary_key=Flase,主鍵,對AutoField設置主鍵后,就會代替原來的自增id列
4、auto_now=True,自動創建-----無論添加或修改,都是當前操作的時間;auto_now_add=True,自動創建-----永遠是創建時得時間。
5、chocies
GENDER_CHOICE = {
    (0,'Male'),
    (1,'Female'),
}
gender = models.CharField(max_length=2,choices=GENDER_CHOICE,defalut=1)
用戶在頁面上看到的性別是Male和Female,真是存儲到數據庫里的數據是0和1,這樣就省去了性別和數字的聯表操作。
6、max_length
7、defalut 默認值
8、verbose_name Admin頁面中字段的顯示名稱,比如name = CharField(max_length=32,verbose_name="用戶名"),那admin頁面就會顯示用戶名,而不是顯示name。
9、db_column,數據庫中的列名;name = CharField(max_length=32)這一列的列名默認是name,如果name = CharField(max_length=32,db_column='n'),那么name這一列的列名就是n了。
10、unique=True,不允許重復
11、db_index=True,數據庫索引
12、editable=True,在Admin里是否可以編輯;如果設置為False,則這一項直接在admin頁面上不顯示了,還編輯個毛。
13、error_messages=None,指定顯示的錯誤信息,比如“用戶名不能為空”。
14、auto_created=False,自動創建
15、help_text,在Admin中添加幫助信息
16、validators=[],可以在里面放函數,比如放一個校驗是否是合法手機號的函數,然后用戶輸入的內容就會根據這個函數去校驗。
17、upload_to,設置上傳目錄。img = models.ImageField(upload_to="upload")

 12.Model之基本數據操作

利用雙下划線將字段和對應的操作連接起來

# 獲取個數
    #
    # models.Tb1.objects.filter(name='seven').count()

    # 大於,小於
    #
    # models.Tb1.objects.filter(id__gt=1)              # 獲取id大於1的值
    # models.Tb1.objects.filter(id__lt=10)             # 獲取id小於10的值
    # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 獲取id大於1 且 小於10的值

    # in
    #
    # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 獲取id等於11、22、33的數據
    # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

    # contains,這個就等同於mysql里的like,模糊查詢
    #
    # models.Tb1.objects.filter(name__contains="ven")
    # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感
    # models.Tb1.objects.exclude(name__icontains="ven")

    # range
    #
    # models.Tb1.objects.filter(id__range=[1, 2])   # 范圍bettwen and

    # 其他類似
    #
    # startswith,istartswith, endswith, iendswith,

    # order by
    #
    # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
    # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc

    # limit 、offset
    #
    # models.Tb1.objects.all()[10:20] #這就可以實現分頁查詢了。

    # group by
    from django.db.models import Count, Min, Max, Sum
    # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))  #以values里的值進行groupby
    # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
    
#如果想知道django里的數據庫操作語句對應的mysql語句是什么,可以通過下面的方法。
obj = models.Tb1.objects.filter(name='seven').count()
print(obj.query)
    

 13.用ajax實現刪除條目和編輯條目

用ajax刪除條目,后台數據庫刪除了數據,但是前端依然顯示這一條記錄,兩個解決辦法:

1.點了刪除后強制讓頁面刷新;

2.點刪除后,將這個條目的div移除($().remove()),然后替換成一個“刪除成功”的div。

編輯條目:

1.點編輯后跳轉到新的url;

2.點編輯后彈出編輯框。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM