Django筆記11-分類頁面與模板繼承

分類頁面與模板繼承

顯示單一類別的文章列表

分類頁面

?分類頁面與首頁基本相同壕翩,但是顯示的是指定類別的文章

模板

?在之前下載的模板文件中妹沙,有一個名為 category.html 的文件,將其復制到 templates/blog/ 目錄下

$ cp category.html ~/fbckf/templates/blog

添加 url 規(guī)則

?分類頁面的 url 是 127.0.0.1:8000/category/[分類名稱]/ 這種格式

# blog/urls.py
from . import views

app_name = 'blog'
urlpatterns = [
    ...
    path('category/<slug>/', views.category, name='category'),
]

添加視圖函數(shù)

# blog/views.py
...
def category(request, slug):
    context = {}
    category = Category.objects.get(name=slug)
    context['category'] = category.name
    article_list = category.article_set.all()
    context['article_list'] = article_list
    category_list = Category.objects.all()
    context['category_list'] = category_list
    if request.user.is_authenticated:
        context['username']= request.user.username
    return render(request, 'blog/category.html', context=context)

修改模板文件

?模板文件中大部分和首頁差不多

<!-- templates/blog/category.html -->
<!-- blog-content -->
...
    <div class="container content">
      <div class="blog-header">
        <h1 class="blog-title ">Simple</h1>
        <p class="lead blog-description">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non quos commodi mollitia possimus, ab ad inventore consectetur in nam! Enim harum ipsum aspernatur similique et, quia earum dolor accusantium unde?</p>
      </div>
      <nav aria-label="breadcrumb">
        <ol class="breadcrumb bg-light">
          <li class="breadcrumb-item active" aria-current="page">{{ category }}</li>
          <!-- <li class="breadcrumb-item active" aria-current="page">Library</li> -->
        </ol>
      </nav>

      <div class="row">
        <div class="col-sm-8">
          {% if article_list %}
          {% for article in article_list %}
          <div class="card">
              <img src="{% static 'blog/img/1.jpg' %}" alt="cat" class="card-img-top">
              <div class="card-body">
                <h5 class="card-title">{{ article.title }}</h5>
                <p class="card-text">{{ article.abstract }}</p>
                <a href="{% url 'blog:article' article.title %}" class="btn btn-dark">more</a>
              </div>
          </div>
          {% endfor %}
          {% endif %}
        </div>
...

?以上部分是最大的不同點

模板繼承

?仔細對比,可以發(fā)現(xiàn)首頁和分類頁面有很大的相同枣购,而這些相同地方的代碼無疑是重復梧疲,django 中,將重復的 html 代碼抽離出來形成一個新的 html 文件排惨,之后通過特定的標簽進行繼承吭敢。

分離代碼

?將相同的代碼抽離放在 templates/base.html

<!-- templates/base.html -->
{% load staticfiles %}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Fbckf Blog</title>

    <!-- Bootstrap -->
    <link href="{% static 'blog/css/bootstrap.min.css' %}" rel="stylesheet">
    <link href="{% static 'blog/css/base.css' %}" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="{% static 'blog/css/font-awesome.css' %}">
    <link rel="stylesheet" type="text/css" href="{% static 'blog/css/font-awesome.min.css' %}">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <!-- nav -->
    <div class="container">
      <nav class="navbar navbar-light border-bottom" style="background-color: white">
        <span class="navbar-brand font-italic">
          <a href="{% url 'blog:index' %}" class="btn-light">
          Fbckf
          </a>
        </span>
        <div class="my-2 my-lg-0">
          {% if username %}
          <a href="/admin" class="btn btn-outline-dark" role="button">{{ username }}</a>
          {% else %}
          <a href="/admin" class="btn btn-outline-dark" role="button">Sign in</a>
          {% endif %}
        </div>        
      </nav>
    </div>

    <!-- blog-content -->
    <div class="container content">
      <div class="blog-header">
        <h1 class="blog-title ">Simple</h1>
        <p class="lead blog-description">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non quos commodi mollitia possimus, ab ad inventore consectetur in nam! Enim harum ipsum aspernatur similique et, quia earum dolor accusantium unde?</p>
      </div>

    <!-- 用 block 標簽將不同部分替代 -->
        {% block body %}
        {% endblock body %}


        <div class="col-sm-4 col-sm-offset blog-sidebar">
          <div class="sidebar-module sidebar-module-inset">
            <h4>關于</h4>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ullam alias fugiat, commodi eum fugit in fuga veritatis magni, velit minima tenetur deserunt minus repellat ea voluptatibus consequuntur asperiores quam cumque.</p>
          </div>
          <div class="sidebar-module">
            <h4>分類</h4>
            <ul class="list-group">
            {% for category in category_list %}
              <li class="list-group-item d-flex justify-content-between align-items-center">
                <a href="{% url 'blog:category' category.name %}">{{ category.name }}</a>
                <span class="badge badge-light badge-pill">{{ category.article_count }}</span>
              </li>
            {% empty %}
              <li class="list-group-item d-flex justify-content-between align-items-center">
                暫無分類
              </li>
            {% endfor %}
            </ul>
          </div>
          <div class="sidebar-module">
            <div class="input-group mb-3 content">
              <div class="input-group-prepend">
                <span class="input-group-text" id="basic-addon1">
                  <i class="fa fa-search" aria-hidden="true"></i>
                </span>
              </div>
              <form action="{% url 'blog:search' %}" method="post">
                {% csrf_token %}
              <input name="query" type="text" class="form-control" placeholder="Search" aria-label="Search" aria-describedby="basic-addon1">
              </form>
            </div>
          </div>
        </div>
      </div>   
    </div>

    {% if is_page %}
    <!-- Pagination -->
    <div class="justify-content-center">
      <nav aria-label="Page navigation">
        <ul class="pagination justify-content-center">
          <li class="page-item">
            <a href="?page=1" class="page-link bg-light text-dark" aria-label="Previous">
              <span aria-hidden="true">&laquo;</span>
              <span class="sr-only">Previous</span>
            </a>
          </li>
        {% ifequal article_list.number article_list.paginator.num_pages %}
          <li class="page-item"><a href="?page={{ article_list.number|add:-2 }}" class="page-link bg-light text-dark">{{ article_list.number|add:-2 }}</a></li>
        {% endifequal %}

        {% ifnotequal article_list.number|add:-1 0 %}
          <li class="page-item"><a href="?page={{ article_list.number|add:-1 }}" class="page-link bg-light text-dark">{{ article_list.number|add:-1 }}</a></li>
        {% endifnotequal %}

          <li class="page-item disabled"><a href="?page={{ article_list.number }}" class="page-link bg-dark text-light">{{ article_list.number}}</a></li>

        {% ifnotequal article_list.number article_list.paginator.num_pages %}
          <li class="page-item"><a href="?page={{ article_list.number|add:1 }}" class="page-link bg-light text-dark">{{ article_list.number|add:1 }}</a></li>
        {% endifnotequal %}

        {% ifequal article_list.number|add:-1 0 %}
          <li class="page-item"><a href="?page={{ article_list.number|add:2 }}" class="page-link bg-light text-dark">{{ article_list.number|add:2 }}</a></li>
        {% endifequal %}
          <li class="page-item">
            <a href="?page={{ article_list.paginator.num_pages}}" class="page-link bg-light text-dark" aria-label="Next">
              <span aria-hidden="true">&raquo;</span>
              <span class="sr-only">Next</span>
            </a>
          </li>
        </ul>
      </nav>
    </div>
    {% endif %}
    
    <!-- button-back-top -->
    <button class="btn btn-outline-dark back-top" id="backTop">
      <i class="fa fa-arrow-up" aria-hidden="true"></i>
    </button>

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="{% static 'blog/js/jquery-3.2.1.min.js' %}"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
    <!-- myjq -->
    <script src="{% static 'blog/js/base.js' %}"></script>
  </body>
</html>

&esmp;以上就是兩個模板文件的相同部分,提取出來之后暮芭,修改 index.htmlcategory.html 模板鹿驼,將相同部分刪除,只留下不同部分

<!-- templates/blog/index.html -->
{% extends 'base.html' %}
{% load staticfiles %}
{% block body %}
      <div class="row">
        <div class="blog-main col-sm-8">
        {% for article in article_list %}
          <div class="jumbotron bg-light">
            <h1 class="display-4">{{ article.title }}</h1>
            <p class="lead">{{ article.abstract }}</p>
            <hr class="my-4">
            <p class="text-muted">{{ article.create_time }} , by  {{ article.author }}</p>
            <a href="{% url 'blog:article' article.title %}" class="btn btn-dark btn-lg" role="button">Read more</a> 
          </div>
        {% empty %}
         {% if error_msg %}
            <div class="jumbotron bg-light">
              <p class="lead">{{ error_msg }}</p>
            </div>
          {% else %}      
            <div class="jumbotron bg-light">
              <p class="lead">暫無文章辕宏,敬請期待畜晰!</p>
            </div>
          {% endif %}
        {% endfor %}
        </div> 
{% endblock body %}

?通過 {% extends 'base.html' %} 繼承 base.html 模板,再使用 {% block %} 標簽將代碼包括起來瑞筐,渲染時會替代 base.html 模板中的相同標簽凄鼻。

?category.html 模板也差不多

<!-- templates/blog/category.html -->
{% extends 'base.html' %}
{% load staticfiles %}

{% block body %}
      <nav aria-label="breadcrumb">
        <ol class="breadcrumb bg-light">
          <li class="breadcrumb-item active" aria-current="page">{{ category }}</li>
          <!-- <li class="breadcrumb-item active" aria-current="page">Library</li> -->
        </ol>
      </nav>

      <div class="row">
        <div class="col-sm-8">
          {% if article_list %}
          {% for article in article_list %}
          <div class="card">
              <img src="{% static 'blog/img/1.jpg' %}" alt="cat" class="card-img-top">
              <div class="card-body">
                <h5 class="card-title">{{ article.title }}</h5>
                <p class="card-text">{{ article.abstract }}</p>
                <a href="{% url 'blog:article' article.title %}" class="btn btn-dark">more</a>
              </div>
          </div>
          {% endfor %}
          {% endif %}
        </div>
{% endblock body %}

?分類頁面也有分頁功能,需要修改視圖函數(shù)

# blog/views.py
...
def category(request, slug):
    context = {}
    if slug:
        category = Category.objects.get(name=slug)
        context['category'] = category.name
        article_list = category.article_set.all().order_by('-create_time')
        if article_list.count() > 10:
            paginator = Paginator(article_list, 5)
            page = request.GET.get('page')
            if page == None:
                page=1
            page_list = paginator.page(page)
            context['article_list'] = page_list
            context['is_page'] = True
        else:
            context['article_list'] = article_list
        category_list = Category.objects.all()
        context['category_list'] = category_list
        if request.user.is_authenticated:
            context['username']= request.user.username
        return render(request, 'blog/category.html', context=context)

總結

?總的來說聚假,個人博客項目到這里就已經(jīng)完成了块蚌,剩下的只是一些細微的調整。之后可以將項目部署到服務器上使用了膘格。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峭范,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘪贱,更是在濱河造成了極大的恐慌纱控,老刑警劉巖游岳,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異其徙,居然都是意外死亡胚迫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門唾那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來访锻,“玉大人,你說我怎么就攤上這事闹获∑谌” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵避诽,是天一觀的道長龟虎。 經(jīng)常有香客問我,道長沙庐,這世上最難降的妖魔是什么鲤妥? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮拱雏,結果婚禮上棉安,老公的妹妹穿的比我還像新娘。我一直安慰自己铸抑,他們只是感情好贡耽,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹊汛,像睡著了一般蒲赂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刁憋,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天滥嘴,我揣著相機與錄音,去河邊找鬼职祷。 笑死氏涩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的有梆。 我是一名探鬼主播是尖,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泥耀!你這毒婦竟也來了饺汹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痰催,失蹤者是張志新(化名)和其女友劉穎兜辞,沒想到半個月后迎瞧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡逸吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年凶硅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扫皱。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡足绅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出韩脑,到底是詐尸還是另有隱情氢妈,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布段多,位于F島的核電站首量,受9級特大地震影響,放射性物質發(fā)生泄漏进苍。R本人自食惡果不足惜加缘,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琅捏。 院中可真熱鬧生百,春花似錦、人聲如沸柄延。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搜吧。三九已至,卻和暖如春杨凑,著一層夾襖步出監(jiān)牢的瞬間滤奈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工撩满, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜒程,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓伺帘,卻偏偏與公主長得像昭躺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伪嫁,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1领炫、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評論 3 119
  • 最近我在聽“好好說話”這個節(jié)目≌趴龋“好好說話”的主講者們就是《奇葩說》節(jié)目的年度冠軍獲得者帝洪。通俗的...
    初中時代的思考者閱讀 420評論 2 4
  • 小時候似舵,希望自己快點長大, 長大了葱峡,卻發(fā)現(xiàn)遺失了童年砚哗; 單身時,開始羨慕戀人的甜蜜砰奕, 戀愛時频祝,懷念單身時的自由。 ...
    福福生薇閱讀 173評論 0 0
  • 人實在太多他只能坐到對座攤開那本分行的書然后偷偷寫下點什么你忍住不說話從雜志上維密的兩腿間看那張異鄉(xiāng)人的臉看他的拿...
    阿劍啊閱讀 132評論 2 9
  • 這真的好難描述啊脆淹,我覺得不僅僅是矛盾吧常空,感覺是無法溝通,這就是我說的“獨立”盖溺,但妹子應該都會考慮這樣的問題吧漓糙?難道...
    thewq閱讀 168評論 0 0