模板(View)

后端渲染

1.模板的配置和渲染函數

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
resp = render(request, 'index.html', {'foo': ...})

2.模板遇到變量名的查找順序琴拧。

  • 字典查找(如:foo['bar']
  • 屬性查找(如:foo.bar
  • 方法調用(如:foo.bar()
    • 方法不能有必須傳值的參數
    • 在模板中不能夠給方法傳參
    • 如果方法的alters_data被設置為True則不能調用該方法(避免誤操作的風險),模型對象動態(tài)生成的delete()save()方法都設定了alters_data = True.
  • 列表索引查找(如:foo[0]

3.模板標簽的使用贞谓。

  • {% if %} / {% else %} / {% endif %}
  • {% for %} / {% endfor %}
  • {% ifequal %} / {% endifequal %} / {% ifnotequal %} / {% endifnotequal %}
  • {# comment #} / {% comment %} / {% endcomment %}

4.過濾器的使用唧龄。

  • lower/upper/first/last/truncatewords/date/time/length/pluralize/center/ljust/rjust/cut/urlencode/default_if_none/filesizeformat/join/slice/slugify

5.模板的包含和繼承。

  • {% include %} / {% block %}
  • {% extends %}

6.模板加載器(后面優(yōu)化部分會提到)

  • 文件系統(tǒng)加載器
TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
}]
  • 應用目錄加載器
TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'APP_DIRS': True,
}]

前端渲染

1.前端模板引擎:Handlebars/Mustache

2.前端MV*框架。

  • MVC - AngularJS
  • MVVM(Model - View - ViewModel) - Vue.js

其他視圖

1.MIME(多用途Internet郵件擴展)類型 - 告知瀏覽器傳輸的數據類型玻蝌。

![1NBG$$A{38P[WJ)473M83.png](https://upload-images.jianshu.io/upload_images/14356833-a25c06ae114f2036.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.如何處置生成的內容(inline / attachment)。

>>> from urllib.parse import quote
>>>
>>> response['content-type'] = 'application/pdf'
>>> filename = quote('Python語言規(guī)范.pdf')
>>> filename
'Python%E8%AF%AD%E8%A8%80%E8%A7%84%E8%8C%83.pdf'
>>> response['content-disposition'] = f'attachment; filename="{filename}"'

提醒:URL以及請求和響應頭中的中文都應該處理成百分號編碼

3.生成CSV / Excel / 統(tǒng)計報表

  • 向瀏覽器傳輸二進制數據词疼。
buffer = ByteIO()

resp = HttpResponse(content_type='...')
resp['Content_Disposition'] = 'attachement;filename='...''
resp.write(buffer.,getvalue())
def get_style(name,color=0,bold=False,italic=False):
  style = xlwt.XFStyle()
  font = xlwt.Font()
  font.name = name
  font.colour_index = color
  font.bold = bold
  font.italic = italic
  style.font = font
  return style

def export_emp_excel(request):
  # 創(chuàng)建Excel工作簿(使用三方庫xlwt)
  workbook = xlwt.Workbook()
  # 想工作簿中添加工作表
  sheet = workbook.add_sheet('員工詳細信息')
  # 設置表頭
  titles = ['編號','姓名','主管','職位','工資','部門名稱']
  for col, title in enumerate(titles):
    sheet.write(0, col, title, get_style('HanziPenSC-W3', 2, True))
  # 使用Django的ORM框架查詢員工數據
  emps =     Emp.objecets.all().select_related('dept').select_related('mgr')
 cols = ['no', 'name', 'mgr', 'job', 'sal', 'dept']
  # 通過嵌套的循環(huán)將員工表的數據寫入Excel工作表的單元格中
  for row, emp in enumerate(emps):
    for col, prop in enumerate(cols):
      val = getattr(emp, prop, '')
      if isinstace(val, (Dept, Emp)):
        val = val.name
      sheet.write(row + 1, col, val)
  # 將Excel文件的二進制數據寫入內存
  buffer = BytesIO()
  workbool.save(buffer)
  # 通過HttpResponse對象向瀏覽器輸出Excel文件
  resp = HttpResponse(buffer.getvalue())
  resp['content-type'] = 'application/msexcel'
  # 如果文件名中有中文需要處理成百分號編碼
  resp['content-disposition'] = 'attachment; filename = "detail.xls"'
  return resp
  • 大文件的流式處理:StreamingHttpResponse俯树。
def download_file(request):
  file_stream = open('...', 'rb')
  # 如果文件的二進制數據較大則最好用迭代器進行處理避免過多的占用服務器內存
  file_iter = iter(lambda: file_stream.read(4096), b'')
  resp = StreamingHttpResponse(file_iter)
  #中文文件名要處理成百分號編碼
  filename = quote('...', 'uft-8')
  resp['Content-Type'] = '...'
  resp['Content-Disposition'] = f'attachment; 
  filename = "{filename}"'
  return resp

說明:如果需要生成PDF文件,可以阿娜黃reportlab贰盗。另外许饿,使用StreamingHttpResponse只能減少內存的開銷,但是如果下載一個大文件會導致一個請求長時間占用服務器資源舵盈,比較好的做法還是把報表提前生成好(可以考慮使用定時任務)陋率,放在靜態(tài)資源服務器或者是云存儲服務器上以訪問靜態(tài)資源的方式訪問

  • EChartsChart.js
    • 思路:后端只提供JSON格式的數據秽晚,前端JavaScript渲染生成圖表瓦糟。
def get_charts_data(request):
    """獲取統(tǒng)計圖表JSON數據"""
    names = []
    totals = []
    # 通過connections獲取指定數據庫連接并創(chuàng)建游標對象
    with connections['backend'].cursor() as cursor:
        # 在使用ORM框架時可以使用對象管理器的aggregate()和annotate()方法實現分組和聚合函數查詢
        # 執(zhí)行原生SQL查詢(如果ORM框架不能滿足業(yè)務或性能需求)
        cursor.execute('select dname, total from vw_dept_emp')
        for row in cursor.fetchall():
            names.append(row[0])
            totals.append(row[1])
    return JsonResponse({'names': names, 'totals': totals})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>統(tǒng)計圖表</title>
    <style>
        #main {
            width: 600px;
            height: 400px;
        }
    </style>
</head>
<body>
    <div id="main"></div>
    <script src="https://cdn.bootcss.com/echarts/4.2.0-rc.2/echarts.min.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        var myChart = echarts.init($('#main')[0]);
        $.ajax({
            'url': 'charts_data',
            'type': 'get',
            'data': {},
            'dataType': 'json',
            'success': function(json) {
                var option = {
                    title: {
                        text: '員工分布統(tǒng)計圖'
                    },
                    tooltip: {},
                    legend: {
                        data:['人數']
                    },
                    xAxis: {
                        data: json.names
                    },
                    yAxis: {},
                    series: [{
                        name: '人數',
                        type: 'bar',
                        data: json.totals
                    }]
                };
                myChart.setOption(option);
            },
            'error': function() {}
        });
    </script>
</body>
</html>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赴蝇,隨后出現的幾起案子狸页,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芍耘,死亡現場離奇詭異址遇,居然都是意外死亡,警方通過查閱死者的電腦和手機斋竞,發(fā)現死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門倔约,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坝初,你說我怎么就攤上這事浸剩。” “怎么了鳄袍?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵绢要,是天一觀的道長。 經常有香客問我拗小,道長重罪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任哀九,我火速辦了婚禮剿配,結果婚禮上,老公的妹妹穿的比我還像新娘阅束。我一直安慰自己呼胚,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布息裸。 她就那樣靜靜地躺著蝇更,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呼盆。 梳的紋絲不亂的頭發(fā)上年扩,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音宿亡,去河邊找鬼。 笑死纳令,一個胖子當著我的面吹牛挽荠,可吹牛的內容都是我干的。 我是一名探鬼主播平绩,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼圈匆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捏雌?” 一聲冷哼從身側響起跃赚,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纬傲,有當地人在樹林里發(fā)現了一具尸體满败,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年叹括,在試婚紗的時候發(fā)現自己被綠了算墨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡汁雷,死狀恐怖净嘀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情侠讯,我是刑警寧澤挖藏,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站厢漩,受9級特大地震影響膜眠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜袁翁,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一柴底、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粱胜,春花似錦柄驻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涯曲,卻和暖如春野哭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幻件。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工拨黔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绰沥。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓篱蝇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親徽曲。 傳聞我的和親對象是個殘疾皇子零截,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • 在控制器的方法中調用如下方法: $this -> display();//模板名稱與當前操作方法的名稱一致 $th...
    hello大象閱讀 47評論 0 0
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,125評論 0 3
  • github地址,歡迎大家提交更新弧哎。 express() express()用來創(chuàng)建一個Express的程序雁比。ex...
    Programmer客棧閱讀 2,503評論 0 1
  • 《緣故緣故》 含淚而笑,因風起航傻铣。 緣故緣故章贞,境遇如此。 我本候鳥非洲,茫然回眸鸭限。 終等那時,北有佳人两踏。 一封書...
    Ulia閱讀 518評論 0 7
  • 最近在追劇《知否知否败京,應是綠肥紅瘦》,我不追星梦染,也不太看娛樂新聞赡麦,但是對趙麗穎一直是有好感,喜歡她的清秀模樣和清澈...
    欣欣然也閱讀 583評論 0 2