Django模板語言-1:一個完整的數據獲取例子

一、Django表單(form)請求:

    打開的時候默認是GET請求,獲取form表單的內容。

    點提交的時候是POST請求,提交form表單的內容。

    根據以上區別來編寫獲取表單內容:

from django.shortcuts import HttpResponse
from django.shortcuts import render, redirect

def login(request):
    # request包含用戶提交的所有信息。
    error_msg = ''
    if request.method == 'POST':
        user = request.POST.get('user', None)        //使用get方法獲取'user'鍵值,如果沒有user鍵,賦值None
        pwd = request.POST.get('pwd', None)          //get方法裏的user和pwd是form表單裏input對象的name屬性。
        if user == '123' and pwd == '123456':
            return redirect('http://www.baidu.com')
        else:
            error_msg = '用戶名或密碼錯誤'
    
    return render(request, 'login.html', {'error_msg':error_msg})


二、{{key}}

        {{}}在html文件中指定key,通過views.py傳遞字典,html在客戶端顯示的是典對應的key值。

        HTML

<span>{{error_msg}}<span>


三、HTML讀取字典數據和列表

        字典:使用  .  讀取讀典key:  dict_name.key

        列表:使用 .索引讀取,list_name.0

        views.py

def show(request):
    dict_name = {'name':'櫻', 'age':19, 'mail':'[email protected]', 'fav':['football', 'sing', 'cook']}
    return render(request,'home.html', dict_name)

        字典HTML:

<p>{{dictname.name}}</p>            \\櫻
<p>{{dictname.age}}</p>             \\19
<p>{{dictname.mail}}</p>            \\[email protected]

        列表HTML

<p>{{list_name.0}}</p>            \\football
<p>{{list_name.1}}</p>            \\sing
<p>{{list_name.2}}</p>            \\cook


四、HTML中for循環:

        使用{%%}標記循環語句,並且使用{%endfor%}聲明循環結束

{%for k, v in dict_name%}
    \\HTML內容
    <p>{{k}}:{{v}}</p>
{%endfor%}
//views.py
return render(request, 'index.html', {'list_name':['a','b','c']})

{%for i in list_name%}
    <p>{{i}}</p>        //a,b,c
{%endfor%}

五、HTML中if循環:

{%if 條件1 %}
    \\HTML內容
    <p>{{k}}:{{v}}</p>
{%elif 條件2%}
    ...
{%else%}
    ...
{%endfor%}


六、views.py獲取html模板傳入的數據

    html提交的數據方法有很多種,一般使用兩類:POST和GET

        1、POST方法請求:一般用於修改、更新數據。

        2、GET方法請求:以網址顯示方式提交,例:http:\\localhost\hw\?id=1&name=david,一般用於向服務器請求數據

        3、其它。put,delete,head,option....

        4、上傳文件類型的數據,在Form表單指定-->enctype='multipart/form-data'

     views.py獲取數據方法:

        1、POST.get('name','默認值'),獲取元素的唯一值,如果沒有,賦默認值

        2、POST.getlist('name','默認值'),獲取多值元素的列表,如果沒有,賦默認值

def get_data(request):
    get_post = request.POST.get('user_name')             # 獲取HTML元素名爲user_name的值 ,<input name='user_name'>
    get_post = request.POST.get('user_name',None)        # 找不到user_name元素,返回None
    get_list = request.POST.getlist('favor')                       # 獲取checkbox,multiple的HTML值
    get_get = request.GET.get('user_name')             # 同上
    get_get = request.GET.get('user_name',None)        # 同上
    get_get = request.GET.getlist('user_name')

        3、FILES.get('name'),獲取上傳的文件對象,默認顯示文件名,
                obj.name顯示上傳的文件名,
                obj.chunks()迭代器讀取數據塊,使用for循環讀取所有數據,for r in obj.chunks()

def get_file(request):
    obj = request.FILES.get('file_obj')
    f = open(obj.name, 'wb+')        # 以上傳的文件名命名。
    for i in obj.chunks():           # 循環讀取chunks迭代器數據。
        f.write(i)
    f.close()


七、views.py函數返回網址:

    1、render:HTML模板路徑,格式:render(request,'HTML模板名',傳遞的字典)

    2、redirect:返回一個完整的URL ,格式:redirect('http://www.baidu.com')

    3、HttpResponse:返回HTML的字符串,格式:HttpResponse('<p>這只是一個例子</p>')

def show_data(request):
    v=1234
    # 站內跳轉
    return render(request,'index.html',{"dict":v})
    # 站外跳轉
    return redirect('http://www.baidu.com')
    # 直接返回HTML字符串。
    return HttpResponse('<p>警告!</p>')



上傳文件示例:

urls.py

from django.conf.urls import url
from django.contrib import admin
import index.views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url( r'^mains$',index.views.mains),            # http://ip/mians,跳轉到index目錄下的views.py下的mains函數
    ## url( r'',index.views.mains),                        # http://ip,跳轉到index目錄下的views.py下的mains函數
    url(r'^mains/up$', index.views.rev_file)       # r'^  $'定義^開頭$結尾,否則,所有包含此單詞的地址都轉向,容易混淆
]

index.html

    使用了{{}},{%%},模板語言。同時上傳

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="up" enctype="multipart/form-data" method="post">  
 //action,跳轉到的網址,action="/up"代表 根目錄+up;action="up"代表 當前網址+up
             
 //enctype,form表單可接收文件             
    <input type="text" name="user_name" placeholder="Input your name..." />
    <input name="up_file" type="file"/>
    //type="file",代表可以上傳文件型數據
    <p>
        文件分類:
        軟件<input type="checkbox" value="技術" name="f_type">
        HTML<input type="checkbox" value="HTML" name="f_type">
        編程<input type="checkbox" value="編程" name="f_type">
    </p>
    //創建多選框
    <input type="submit" value="提交">
</form>
{% if f_name %}        //使用if判斷是否上傳文件,上傳文件,顯示信息
<p><span style="font-style: italic">{{ u_name }}</span>,Your file:{{ f_name }} Upload Successful!</p>
分類:
    {% for i in f_type %}            //使用for讀取選擇的文件分類 
        {{ i }}
    {% endfor %}                    
{% else %}                           //未上傳文件提示
<p><span>You don't upload file!</span></p>
{% endif %}
</body>
</html>

test/views.py

from django.shortcuts import render
import os
# Create your views here.

def mains(request):
    # 首次打開網址,進入的index.html頁面
    return render(request, 'index.html')

def rev_file(request):
    # 接收form表單提交的數據
    f_name = ''
    u_name = ''
    f_type = ''
    if request.method == 'POST':
        f_obj = request.FILES.get('up_file', None)            
        # 獲取file對象,print(f_obj)是文件名,但實際是對象,因爲FILES定義了__repr__或__str__
        if f_obj:
            #如果有上傳的文件
            f_name = f_obj.name
            u_name = request.POST.get('user_name', None)
            f_type = request.POST.getlist('f_type')            #獲取checkbox或multiple類型的option選項的數據
            f = open(os.path.join('upload', f_name), 'wb+')    #manage.py同級目錄的upload文件夾
            for i in f_obj.chunks():                           #chunks(),迭代器,使用for讀取
                f.write(i)
            f.close()

    return render(request, 'index.html', {'f_name': f_name, 'u_name': u_name, 'f_type': f_type})
    # 再返回index.html的內容,但瀏覽器網址會變,內容也會出現if語句的內容



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章