Django學(xué)習(xí)(四)

歡迎關(guān)注我的公眾號(hào):zx94_11

生成列表和視圖

  • 博客列表
  • 博客詳情

導(dǎo)包

from django.shortcuts import render, get_object_or_404
from .models import Post

博客列表

def post_list(request):
    posts = Post.published.all()
    return render(request,
                  'blog/post/list.html',
                  {'posts': posts})

博客詳情

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post,
                             slug=post,
                             status='published',
                             publish__year=year,
                             publish__month=month,
                             publish__day=day)
    return render(request,
                  'blog/post/detail.html',
                  {'post': post})

添加URL路徑

打開blog/urls.py寫入

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('<int:year>/<int:month>/<int:day>/<slug:post>/',
         views.post_detail, name='post_detail')
]

mysite/urls.py加上:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls', namespace='blog')),
]

模型的標(biāo)準(zhǔn)URL

由于post_detail的URL比較特別颊咬,所以在blog/models.py中添加特殊的處理

from django.urls import reverse
class Post(models.Model):
   ...
   def get_absolute_url(self):
      return reverse('blog:post_detail', args=[self.publish.year,
                                               self.publish.month,
                                               self.publish.day,
                                               self.slug])

視圖模版

文件結(jié)構(gòu)

base.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'css/blog.css' %}">
</head>
<body>
<div id="content">
    {% block content %}

    {% endblock %}
</div>
<div id="sidebar">
    <h2>My blog</h2>
    <p>This is my blog.</p>
</div>
</body>
</html>

detail.html

{% extends 'blog/base.html' %}
{% block title %}
    {{ post.title }}
{% endblock %}

{% block content %}
<h1>{{ post.title }}</h1>
    <p class="date">
    Published {{ post.publish }} by {{ post.author }}
    </p>
    {{ post.body|linebreaks }}
{% endblock %}

list.html

{% extends 'blog/base.html' %}
{% block title %}
    My blog
{% endblock %}

{% block content %}
    <h1>My Blog</h1>
    {% for post in posts %}
        <h2>
            <a href="{{ post.get_absolute_url }}">
                {{ post.title }}
            </a>
        </h2>
        <p class="date">
            Published {{ post.publish }} by {{ post.author }}
        </p>
        {#truncatewords:將數(shù)值截取至指定的單詞數(shù)量#}
        {#linebreaks:將輸出結(jié)果轉(zhuǎn)換為HTML換行符#}
        {{ post.body|truncatewords:30|linebreaks }}
    {% endfor %}

{% endblock %}

blog.css

body {
    margin: 0;
    padding: 0;
    font-family: helvetica, sans-serif;
}

a {
    color: #00abff;
    text-decoration: none;
}

h1 {
    font-weight: normal;
    border-bottom: 1px solid #bbb;
    padding: 0 0 10px 0;
}

h2 {
    font-weight: normal;
    margin: 30px 0 0;
}

#content {
    float: left;
    width: 60%;
    padding: 0 0 0 30px;
}

#sidebar {
    float: right;
    width: 30%;
    padding: 10px;
    background: #efefef;
    height: 100%;
}

p.date {
    color: #ccc;
    font-family: georgia, serif;
    font-size: 12px;
    font-style: italic;
}

.paginator {
    margin: 40px 0;
    font-weight: bold;
}

label {
    float: left;
    clear: both;
    color: #333;
    margin-bottom: 4px;
}

input, textarea {
    clear: both;
    float: left;
    margin: 0 0 10px;
    background: #ededed;
    border: 0;
    padding: 6px 10px;
    font-size: 12px;
}

input[type=submit] {
    font-weight: bold;
    background: #00abff;
    color: #fff;
    padding: 10px 20px;
    font-size: 14px;
    text-transform: uppercase;
}

.errorlist {
    color: #cc0033;
    float: left;
    clear: both;
    padding-left: 10px;
}

.comment {
    padding: 10px;
}

.comment:nth-child(even) {
    background: #efefef;
}

.comment .info {
    font-weight: bold;
    font-size: 12px;
    color: #666;
}

結(jié)果展示

列表頁(yè)
詳情頁(yè)

添加分頁(yè)機(jī)制

修改blog/views.pypost_list

paginator = Paginator(object_list, 1)里面的數(shù)字決定一頁(yè)里面有幾條數(shù)據(jù)沃粗,為了展示效果,先改為1

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


def post_list(request):
    object_list = Post.published.all()
    paginator = Paginator(object_list, 1)
    page = request.GET.get('page')
    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        # 如果「不是數(shù)字」則去第一頁(yè)
        posts = paginator.page(1)
    except EmptyPage:
        # 如果「頁(yè)數(shù)太大」就去最后一頁(yè)
        posts = paginator.page(paginator.num_pages)
    return render(request,
                  'blog/post/list.html',
                  {'posts': posts, 'page': page})

增加一個(gè)blog/templates/pagination.html

<div class="paginator">
    <span class="step-links">
        {% if page.has_previous %}
            <a href="?page={{ page.previous_page_num }}">Previous</a>
        {% endif %}
        <span class="current">
        Page {{ page.number }} of {{ page.paginator.num_pages }}.
    </span>
        {% if page.has_next %}
            <a href="?page={{ page.next_page_number }}">Next</a>
        {% endif %}
    </span>
</div>

blog/templates/blog/post/list.html最后面添加

   ... 
    {% include "pagination.html" with page=posts %}
{% endblock %}
效果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末街夭,一起剝皮案震驚了整個(gè)濱河市焊切,隨后出現(xiàn)的幾起案子扮授,更是在濱河造成了極大的恐慌,老刑警劉巖专肪,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刹勃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嚎尤,警方通過查閱死者的電腦和手機(jī)荔仁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芽死,“玉大人乏梁,你說(shuō)我怎么就攤上這事」毓螅” “怎么了遇骑?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)揖曾。 經(jīng)常有香客問我落萎,道長(zhǎng)亥啦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任练链,我火速辦了婚禮翔脱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媒鼓。我一直安慰自己届吁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布绿鸣。 她就那樣靜靜地躺著疚沐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枚驻。 梳的紋絲不亂的頭發(fā)上濒旦,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音再登,去河邊找鬼尔邓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锉矢,可吹牛的內(nèi)容都是我干的梯嗽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沽损,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灯节!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绵估,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炎疆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后国裳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體形入,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年缝左,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亿遂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渺杉,死狀恐怖蛇数,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情是越,我是刑警寧澤耳舅,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站倚评,受9級(jí)特大地震影響挽放,放射性物質(zhì)發(fā)生泄漏绍赛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一辑畦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腿倚,春花似錦纯出、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至硬贯,卻和暖如春焕襟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饭豹。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鸵赖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拄衰。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓它褪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親翘悉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茫打,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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