Django的博客项目创建(3)

本文介绍了如何使用Django框架创建一个博客项目,包括博客列表、详情和标签的展示。详细步骤涉及设置模板路径、创建模板文件、注册模板、模型方法、URL配置、视图函数以及自定义模板标签的实现。
摘要由CSDN通过智能技术生成
利用Django实现的功能如下:
  • 博客列表显示
  • 博客详情页显示
  • 博客标签显示
具体实现过程如下:

1.在settings修改模板默认的位置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 'DIRS': [],
        #相对位置好处在于避免文件夹移动和系统linux或windows改变带来的影响。
        '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',
            ],
        },
    },
]

2.添加模板:

base.html:
{% load staticfiles %}
{% load blog_tags %}
<!DOCTYPE html>
<html>
<head>
    <title>Black &amp; White</title>

    <!-- meta -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- css -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'blog/css/pace.css' %}">
    <link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">
    <link rel="stylesheet" href="{% static 'blog/css/highlights/github.css' %}">

    <!-- js -->
    <script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
    <script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
    <script src="{% static 'blog/js/pace.min.js' %}"></script>
    <script src="{% static 'blog/js/modernizr.custom.js' %}"></script>
</head>

<body>
<div class="container">
    <header id="site-header">
        <div class="row">
            <div class="col-md-4 col-sm-5 col-xs-8">
                <div class="logo">
                    <h1><a href="index.html"><b>Black</b> &amp; White</a></h1>
                </div>
            </div><!-- col-md-4 -->
            <div class="col-md-8 col-sm-7 col-xs-4">
                <nav class="main-nav" role="navigation">
                    <div class="navbar-header">
                        <button type="button" id="trigger-overlay" class="navbar-toggle">
                            <span class="ion-navicon"></span>
                        </button>
                    </div>

                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li class="cl-effect-11"><a href="index.html" data-hover="首页">首页</a></li>
                            <li class="cl-effect-11"><a href="full-width.html" data-hover="博客">博客</a></li>
                            <li class="cl-effect-11"><a href="about.html" data-hover="关于">关于</a></li>
                            <li class="cl-effect-11"><a href="contact.html" data-hover="联系">联系</a></li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </nav>
                <div id="header-search-box">
                    <a id="search-menu" href="#"><span id="search-icon" class="ion-ios-search-strong"></span></a>
                    <div id="search-form" class="search-form">
                        <form role="search" method="get" id="searchform" action="#">
                            <input type="search" placeholder="搜索" required>
                            <button type="submit"><span class="ion-ios-search-strong"></span></button>
                        </form>
                    </div>
                </div>
            </div><!-- col-md-8 -->
        </div>
    </header>
</div>


<div class="content-body">
    <div class="container">
        <div class="row">
            <main class="col-md-8">
                {% block main %}
                {% endblock main %}
            </main>
            <aside class="col-md-4">
                {% block toc %}
                {% endblock toc %}
                <div class="widget widget-recent-posts">
                    <h3 class="widget-title">最新文章</h3>
                    {% get_recent_posts as recent_post_list %}
                    <ul>
                        {% for post in recent_post_list %}
                            <li>
                                <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
                            </li>
                        {% empty %}
                            暂无文章!
                        {% endfor %}
                    </ul>
                </div>
                <div class="widget widget-archives">
                    <h3 class="widget-title">归档</h3>
                    {% archives as date_list %}
                    <ul>
                        {% for date in date_list %}
                            <li>
                                <a href="{% url 'blog:archives' date.year date.month %}">{{ date.year }}{{ date.month }}</a>
                            </li>
                        {% empty %}
                            暂无归档!
                        {% endfor %}
                    </ul>
                </div>

  <div class="widget widget-category">
                    <h3 class="widget-title">分类</h3>
                    {% get_categories as category_list %}
                    <ul>
                        {% for category in category_list %}
                            <li>
                                <a href="#">{{ category.name }} <span
                                        class="post-count">(13)</span></a>
                            </li>
                        {% empty %}
                            暂无分类!
                        {% endfor %}
                    </ul>
                </div>

                <div class="widget widget-tag-cloud">
                    <h3 class="widget-title">标签云</h3>
                    <ul>
                        <li>
                            <a href="#">Django</a>
                        </li>
                        <li>
                            <a href="#">Python</a>
                        </li>
                        <li>
                            <a href="#">Java</a>
                        </li>
                        <li>
                            <a href="#">笔记</a>
                        </li>
                        <li>
                            <a href="#">文档</a>
                        </li>
                        <li>
                            <a href="#">AngularJS</a>
                        </li>
                        <li>
                            <a href="#">CSS</a>
                        </li>
                        <li>
                            <a href="#">JavaScript</a>
                        </li>
                        <li>
                            <a href="#">Snippet</a>
                        </li>
                        <li>
                            <a href="#">jQuery</a>
                        </li>
                    </ul>
                </div>
                <div class="rss">
                    <a href=""><span class="ion-social-rss-outline"></span> RSS 订阅</a>
                </div>
            </aside>
        </div>
    </div>
</div>
<footer id="site-footer">
    <div class="container">
        <div class="row">
            <div class="col-md-12">
                <p class="copyright">&copy 2017 
                </p>
            </div>
        </div>
    </div>
</footer>

<!-- Mobile Menu -->
<div class="overlay overlay-hugeinc">
    <button type="button" class="overlay-close"><span class="ion-ios-close-empty"></span></button>
    <nav>
        <ul>
            <li><a href="index.html">首页</a></li>
            <li><a href="full-width.html">博客</a></li>
            <li><a href="about.html">关于</a></li>
            <li><a href="contact.html">联系</a></li>
        </ul>
    </nav>
</div>

<script src="{% static 'blog/js/script.js' %}"></script>

</body>
</html>
detail.html:
{% extends 'base.html' %}

{% block main %}
    <article class="post post-{{ post.pk }}">
        <header class="entry-header">
            <h1 class="entry-title">{{ post.title }}</h1>
            <div class="entry-meta">
                <span class="post-category"><a href="#">{{ post.category.name }}</a></span>
                <span class="post-date"><a href="#"><time class="entry-date"
                                                          datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span>
                <span class="post-author"><a href="#">{{ post.author }}</a></span>
                <span class="comments-link"><a href="#">4 评论</a></span>
                <span class="views-count"><a href="#">588 阅读</a></span>
            </div>
        </header>
        <div class="entry-content clearfix">
            {{ post.body|safe }}
        </div>
    </article>
    <section class="comment-area" id="comment-area">
        <hr>
        <h3>发表评论</h3>
        <form action="#" method="post" class="comment-form">
            <div class="row">
                <div class="col-md-4">
                    <label for="id_name">名字:</label>
                    <input type="text" id="id_name" name="name" required>
                </div>
                <div class="col-md-4">
                    <label for="id_email">邮箱:</label>
                    <input type="email" id="id_email" name="email" required>
                </div>
                <div class="col-md-4">
                    <label for="id_url">网址:</label>
                    <input type="text" id="id_url" name="url">
                </div>
                <div class="col-md-12">
                    <label for="id_comment">评论:</label>
                    <textarea name="comment" id="id_comment" required></textarea>
                    <button type="submit" class="comment-btn">发表</button>
                </div>
            </div>    <!-- row -->
        </form>
        <div class="comment-list-panel">
            <h3>评论列表,共 <span>4</span> 条评论</h3>
            <ul class="comment-list list-unstyled">
                <li class="comment-item">
                    <span class="nickname">追梦人物</span>
                    <time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年3月12日 14:56</time>
                    <div class="text">
                        文章观点又有道理又符合人性,这才是真正为了表达观点而写,不是为了迎合某某知名人士粉丝而写。我觉得如果琼瑶是前妻,生了三孩子后被一不知名的女人挖了墙角,我不信谁会说那个女人是追求真爱,说同情琼瑶骂小三的女人都是弱者。
                    </div>
                </li>
                <li class="comment-item">
                    <span class="nickname">zmrenwu</span>
                    <time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年3月11日 23:56</time>
                    <div class="text">
                        本能有可能会冲破格局,但格局有时候也会拘住本能。
                    </div>
                </li>
                <li class="comment-item">
                    <span class="nickname">蝙蝠侠</span>
                    <time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年3月9日 8:56</time>
                    <div class="text">
                        其实真理一般是属于沉默的大多数的。那些偏激的观点只能吸引那些同样偏激的人。前几年琼瑶告于妈抄袭,大家都表示大快人心,说明吃瓜观众都只是就事论事,并不是对琼瑶有偏见。
                    </div>
                </li>
                <li class="comment-item">
                    <span class="nickname">长江七号</span>
                    <time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年2月12日 12:56</time>
                    <div class="text">
                        观点我很喜欢!就是哎嘛本来一清二楚的,来个小三小四乱七八糟一团乱麻夹缠不清,简直麻烦要死
                    </div>
                </li>
            </ul>
        </div>
    </section>
{% endblock main %}
{% block toc %}
    <div class="widget widget-content">
        <h3 class="widget-title">文章目录</h3>
        <ul>
            <li>
                <a href="#">教程特点</a>
            </li>
            <li>
                <a href="#">谁适合这个教程</a>
            </li>
            <li>
                <a href="#">在线预览</a>
            </li>
            <li>
                <a href="#">资源列表</a>
            </li>
            <li>
                <a href="#">获取帮助</a>
            </li>
        </ul>
    </div>
{% endblock toc %}
index.html:
{% extends 'base.html' %}

{% block main %}
    {% for post in post_list %}
        <article class="post post-{{ post.pk }}">
            <header class="entry-header">
                <h1 class="entry-title">
                    <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
                </h1>
                <div class="entry-meta">
                    <span class="post-category"><a href="#">{{ post.category.name }}</a></span>
                    <span class="post-date"><a href="#"><time class="entry-date"
                                                              datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span>
                    <span class="post-author"><a href="#">{{ post.author }}</a></span>
                    <span class="comments-link"><a href="#">4 评论</a></span>
                    <span class="views-count"><a href="#">588 阅读</a></span>
                </div>
            </header>
            <div class="entry-content clearfix">
                <p>{{ post.excerpt }}</p>
                <div class="read-more cl-effect-14">
                    <a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav"></span></a>
                </div>
            </div>
        </article>
    {% empty %}
        <div class="no-post">暂时还没有发布的文章!</div>
    {% endfor %}

    <!-- 简单分页效果
    <div class="pagination-simple">
        <a href="#">上一页</a>
        <span class="current">第 6 页 / 共 11 页</span>
        <a href="#">下一页</a>
    </div>
    -->
    <div class="pagination">
        <ul>
            <li><a href="">1</a></li>
            <li><a href="">...</a></li>
            <li><a href="">4</a></li>
            <li><a href="">5</a></li>
            <li class="current"><a href="">6</a></li>
            <li><a href="">7</a></li>
            <li><a href="">8</a></li>
            <li><a href="">...</a></li>
            <li><a href="">11</a></li>
        </ul>
    </div>
{% endblock main %}

3.添加注册模板:

{%block title%}登录页面{%endblock%}

{%block content%}
    <h2>登录页面</h2>
    <form method='post'>
        {% csrf_token%}
        {{form.as_p}}
        <button type='submit'>登录</button>
    </form>
{%endblock%}

4.在post模型中添加获取url的方法:

class Post(models.Model):

    ...

    def get_absolute_url(self):
        #blog是url中的命名空间。
        return reverse('blog:detail' ,kwargs={'pk':self.pk})

5.urls.py中添加命名空间和相关的url:

from django.conf.urls import url
from blog import views

app_name='blog'

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.detail, name='detail'),
    url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.archives, name='archives'),

]

6.views.py中添加相关的视图函数:

from django.shortcuts import render,get_object_or_404

# Create your views here.
from django.http import HttpResponse
from .models import Post
import markdown

...
def detail(request, pk):

    post = get_object_or_404(Post, pk=pk)
    post.views += 1
    post.save()
    post.body = markdown.markdown(post.body,
        extensions=[
        'markdown.extensions.extra',
        'markdown.extensions.codehilite',
        'markdown.extensions.toc'],)
    return render(request,'blog/detail.html', context={'post':post})

def archives(request, year, month):
    post_list = Post.objects.filter(created_time__year=year,
        created_time__month=month).order_by('-created_time')
    return render(request, 'blog/index.html', context={'post_list':post_list})


def category(request, pk):
    post_list = Post.objects.filter(category_id=pk).order_by('-created_time')
    return render(request, 'blog/index.html', context={'post_list':post_list})

7.主urls中添加用户登录登出的功能:

from django.conf.urls import url, include
from django.contrib import admin
from django.contrib.auth import views as auth_views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('blog.urls')),
    url(r'^login/$', auth_views.login, name='login'),
    url(r'^logout/$', auth_views.logout, name='logout'),


]

8.在blog.templatetags中添加blog_tags.py:

生成自定义的模板标签,并注册模板标签。

from django import template
from ..models import Post, Category

register = template.Library()


@register.simple_tag
def get_recent_posts(num=5):
    return Post.objects.all().order_by('-created_time')[:num]

@register.simple_tag
def archives():
    return Post.objects.dates('created_time', 'month', order='DESC')

@register.simple_tag
def get_categories():
    return Category.objects.all()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值