<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [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等傳遞到模板中 ~~~ * 文檔中的截圖 ![](https://box.kancloud.cn/eb3d041fa1f2b5e5883ba214462f938a_644x466.png) * 文檔中的用法 ~~~ 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 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看