[TOC]
>[success] # ListView
~~~
先來看ListView的流程:
1.請求到達之后,首先會調用distpatch進行分發。
2.接著會調用get方法
3.在get請求中,首先會調用get_queryset方法,拿到數據源
4.接著繼續調用get_context_data方法,拿到需要渲染到模板中的數據
5.在get_context_data中,首先會去調用get_paginate_by拿到每頁數據
6.接著調用get_context_object_name拿到要渲染到模板中的這個queryset名稱 *
7.然后調用paginate_queryset進行分頁處理 *
8.把拿到的數據轉為dict,返回
9.調用render_to_response渲染數據到頁面中
10.在render_to_response中會調用get_tempalte_names拿到模板名
11.然后把request, context, template_name等傳遞到模板中
~~~
* 文檔中的截圖

* 文檔中的用法
~~~
from django.views.generic.list import ListView
from django.utils import timezone
from articles.models import Article
class ArticleListView(ListView):
model = Article
def get_context_data(self, **kwargs):
context = super(ArticleListView, self).get_context_data(**kwargs)
context['now'] = timezone.now()
return context
~~~
~~~
from django.conf.urls import url
from article.views import ArticleListView
urlpatterns = [
url(r'^$', ArticleListView.as_view(), name='article-list'),
]
~~~
~~~
<h1>Articles</h1>
<ul>
{% for article in object_list %}
<li>{{ article.pub_date|date }} - {{ article.headline }}</li>
{% empty %}
<li>No articles yet.</li>
{% endfor %}
</ul>
~~~
* 源碼中初始化參數
~~~
allow_empty = True
queryset = None
model = None
paginate_by = None
paginate_orphans = 0
context_object_name = None
paginator_class = Paginator
page_kwarg = 'page'
ordering = None
~~~
>[success] # 博客中的ListView 案例
>[danger] ##### url設計
~~~
from django.conf.urls import url
from django.contrib import admin
from blong.views import IndexView, CategoryView, TagView, PostView
from config.views import links
from .custom_site import custom_site
urlpatterns = [
url(r"^$", IndexView.as_view()),
url(r'^category/(?P<category_id>\d+)/$', CategoryView.as_view(), name="category"),
url(r'^tag/(?P<tag_id>\d+)/$', TagView.as_view(), name="tag"),
url(r'^post/(?P<pk>\d+)/$', PostView.as_view(),name="detail"),
url(r'^links/$', links),
url(r'^admin/', admin.site.urls),
url(r'^cus_admin/', custom_site.urls),
]
~~~
>[danger] ##### 分析講解
~~~
1.博客中首頁數據來自post 數據,不過來源有三種分別是,category,tag,all,依次
對應,分類,標簽,和所有 也就是查詢的都是post 只不過對應三種狀態
2.可以自定義一個基類,對應三個子類,三個子類分別操作 category,tag,all,三種
狀態 分類,標簽,和所有都和post 有關聯
3.想編輯查詢語句 重寫get_queryset 方法
4.model 聲明的是對應的數據庫類
5.template_name 對應的模板信息
6.context_object_name 對應html 頁面k 值,當我們用模板語言的時候需要告訴接受
查詢k名稱
7.paginate_by 分頁的時候頁面顯示的條數
~~~
>[danger] ##### 通用類
~~~
1.這個通用類在博客系統中的邏輯是,上下標題欄,側邊欄,最新評價,和最新文章
2.多個類都用了這部分可以做提取,其中get_category_context()做的是二次提取
3.當我們想返回的數據大于,系統幫我們默認通過get_queryset()查詢返回的數據還要
多的時候 ,重寫get_context_data
~~~
~~~
from pprint import pprint as pp
from django.shortcuts import render
from django.http import Http404
from django.core.paginator import Paginator,EmptyPage
from django.views.generic import ListView, DetailView,FormView
from django.db import connection
from .models import Post, Tag, Categroy
from config.models import SideBar
from comment.models import Comment
# Create your views here.
class CommonMixin:
def get_category_context(self):
categories = Categroy.objects.filter(status=1) # TODO: fix magic number
nav_cates = []
cates = []
for cate in categories:
if cate.is_nav:
nav_cates.append(cate)
else:
cates.append(cate)
return {
'nav_cates': nav_cates,
'cates': cates,
}
def get_context_data(self, **kwargs):
side_bar = SideBar.objects.filter(status=1)
recently_posts = Post.objects.filter(status=1)[:10]
recently_comments = Comment.objects.filter(status=1)[:10]
kwargs.update({
'side_bars': side_bar,
'recently_posts': recently_posts,
"recently_comments": recently_comments
})
kwargs.update(self.get_category_context())
return super(CommonMixin, self).get_context_data(**kwargs) # ** 解碼
~~~
>[danger] ##### 基類代碼
~~~
class BasePostsView(CommonMixin,ListView):
model = Post
template_name = 'blog/list.html'
context_object_name = "posts"
paginate_by = 3
allow_empty = True
~~~
>[danger] ##### 首頁代碼
~~~
1.get_queryset()默認查詢配置項所有數據,也就是 object.all()
~~~
~~~
class IndexView(BasePostsView):
pass
~~~
>[danger] ##### 分類數據展示代碼
~~~
1.重寫get_queryset() 方法,因為分類數據是去查詢和post 一對多關系的category_id
2.我們在url 用了捕獲正則,要獲取 正則的值self.kwargs.get('category_id')
3.一定要先super 父類,通過父類的all,在fittler 過濾查詢我們想要的數據
4.繼承了基類 BasePostsView
~~~
~~~
class CategoryView(BasePostsView):
def get_queryset(self):
qs = super(CategoryView, self).get_queryset()
cate_id = self.kwargs.get('category_id')
qs = qs.filter(category_id=cate_id)
return qs
~~~
>[danger] ##### 標簽數據展示代碼
~~~
1.當我們想查詢的數據不一定是,我們定義model 數據,可以重寫get_queryset()方法
2.熟練使用當獲取單個對象用get
3.捕獲單個對象get 異常用Tag.DoesNotExist
~~~
~~~
class TagView(BasePostsView):
def get_queryset(self):
tag_id = self.kwargs.get("tag_id")
try:
tag = Tag.objects.get(id=tag_id)
except Tag.DoesNotExist:
return []
posts = tag.post_set.all()
return posts
~~~
- 網絡原理
- 為搭建框架做準備
- 簡單認識網路
- 自定義模擬網站案例
- 優化最終框架
- 數據存儲 -- data
- 用戶個人信息存儲 -- User.txt
- 路由映射 -- routes
- 處理用戶信息 -- routes_static.py
- 保存靜態文件 -- static
- templates -- html 集中處理模塊
- 首頁 -- index.html
- 登陸 -- login.html
- 用戶注冊頁面 -- register
- 日志模塊 -- log.gua.txt
- 啟動文件--server.py
- orm處理 -- model.py
- 日志模塊 -- utils.py
- 兩種數據庫類型
- 傳統數據庫了解篇
- 前端快速入門
- JS簡單使用入門
- css簡單快速入門
- DJANGO
- virtualenv-創建虛擬環境
- 項目結構
- django-admin中文配置
- django-打印sql語句
- django-基礎
- 認識MVC和MTV
- Django--初識
- Django--初識案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-數據庫配置
- ORM-model字段
- ORM-model字段解釋
- ORM-字段選項
- ORM-查詢
- ORM-四種常用查詢方法
- ORM-三種獲取數據
- ORM-其他查詢方式
- ORM-條件查詢雙線
- ORM-Q和F條件使用
- ORM-三種數據庫交互
- 案例 -- 一對多
- ORM-技巧/常見問題
- ORM-N+1 問題
- ORM-并發的處理
- ORM-數量查詢、
- ORM-正向反向查詢
- ORM-基礎案例一
- ORM-基礎一對多案例
- Django-templates
- Django-模板的繼承
- Django-模板的過濾
- Django-自定義模板的過濾
- Django-cookie
- Django-cookies 裝飾器
- Djang-session
- Django-CSRF
- Django-中間件 -- 后續了解
- Django- 緩存 -- 沒有深入了解
- Django-form
- From-ajax
- form-內部驗證處理
- form-屬性
- form-常用的標簽字段
- form-常用的下拉和選擇
- form-widget速查
- Django-ajax序列化
- Django-多種ajax寫法
- ajax-原生寫法
- ajax-$寫法
- ajax-ifram
- Django-ajax圖片上傳
- ajax-原始寫法
- ajax-正常寫法
- iframe+form
- 實戰寫法
- Django-常用自編寫組件
- Django-雙菜單組合搜索
- Django - 多菜單組合搜索
- Django-分頁
- django-綜合基礎
- 綜合基礎-render
- django-admin
- admin-頁面配置
- admin-字段配置
- admin-編輯頁面
- admin-forms驗證
- admin-創建抽象類
- django-驗證碼
- 驗證碼-第三方生成庫
- 驗證碼-view.py使用
- 驗證碼-注意引入Monaco.ttf
- django-用戶注冊
- 注冊-form 模塊
- 注冊-views 模塊
- 注冊-html模塊
- 注冊-model模塊
- django-用戶登錄三種
- session登錄
- form-session 寫法
- view-寫法
- Html-寫法
- model-寫法
- 繼承類登錄
- 外鍵關聯登錄
- django-簡單的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和數據庫關聯的寫法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系統
- APP目錄-models.py 創建
- APP目錄-基礎展示數據分析
- APP目錄-基礎數據展示cls
- ListView
- DetailView
- FormView
- 額外功能拓建
- 添加文章搜索/用戶文章查詢功能
- 增加一個友情鏈接
- 增加一個評論模塊
- App-利用Bootstrap4 搭建樣式
- 項目crm
- 思維導圖
- perfectCRM-項目名字
- settings.py-配置
- view.py-登陸/登出函數
- crm-app文件
- model.py-表的創建
- admin.py-注冊后臺
- view.py-視圖層
- static-靜態文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首頁模板