新手用python Django 创建个人博客的第四天

本文介绍如何使用Django框架实现个人博客的点赞功能,包括前端页面设计、后端视图处理及数据库操作等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好吧,我这个废材又回来了,国庆弄到自己作息紊乱,现在晚上睡不着,白天也不敢睡,要干活,昨天也就是10月8号白天睡到晚上7点,晚上拼命想睡觉,也因为一些小问题屡次走进死胡同出不来,就拖到了今天,在红牛加咖啡的双重保障下,又憋出了几行令我吐血的简单至极的代码,偏偏我还在上面纠结了很久。。。

详情页detail后续

话不多说,放个页面先——

在这里插入图片描述
嗯,点赞按钮卡了我很久,在网上找了很多偏方,一一试验了,太高大上,还多次打乱我原来的数据库,最后放弃治疗直接入土,又回到了原来的视图和模型上。

在这途中是成功过的,但那次按钮只生效了一次,以后就再也没生效过,这让我不得不换另外一个角度想问题,其实也算是一种取巧——

如果我先把试图效果做出来然后再获取参数传入后端呢?

事实证明,可行。下面是代码——

blog_detail.html

{% extends 'blog_list.html' %}

{% block blog %}
    {% csrf_token %}
    <a href="/blog_list/"><< 返回列表</a>
            <div class="page-header">
                <h1 style="color: #5cb85c">
                    {{ b_detail.btitle }}
                </h1>
                <div style="margin: 0;">
                    <span style="opacity: 0.7;font-size: 12px;">发布日期: {{ b_detail.bdata | date:'Y年m月d日' }}</span>
                    <span style="opacity: 0.7;font-size: 12px;margin-left: 100px;margin-right: 100px">阅读数: {{ b_detail.bread }}</span>
                    <a id="b_up"><span class="glyphicon glyphicon-thumbs-up" aria-hidden="true" style="height: 6px;"></span> <span id="bup">{{ b_detail.bup }}</span></a>
                    <a id="b_down" style="margin-left: 20px"><span class="glyphicon glyphicon-thumbs-down" aria-hidden="true" style="height: 6px;"></span><span id="bdown">{{ b_detail.b_low }}</span> </a>

                </div>



            </div>
            <div>
                <p>{{ b_detail.btext | safe }}</p>
            </div>
            <div>
                <nav aria-label="..." style="margin-top: 100px">
                    <ul class="pager">
                        {% if blog_prev %}
                            <li class="previous"><a href="/blog_detail_{{ blog_prev.id }}/" id="prev1"><span aria-hidden="true">&larr;</span> 上一篇 {{ blog_prev.btitle | truncatechars:8 }}</a></li>
                        {% else %}
                            <li class="previous"><span aria-hidden="true" style="color: #9acfea">没有了</span></li>
                        {% endif %}
                        {% if blog_next %}
                            <li class="next"><a href="/blog_detail_{{ blog_next.id }}/" id="next1">{{ blog_next.btitle }} 下一篇 <span aria-hidden="true">&rarr;</span></a></li>
                        {% else %}
                            <li class="next"><span aria-hidden="true" style="color: #9acfea">没有了</span></li>
                        {% endif %}
                        </ul>
                </nav>
            </div>
            <div>
                评论区
            </div>


<script>

        $(function () {
                $('#b_up').click(function () {
                    let num = $('#bup').html();
                    {#console.log(num);#}
                    num++;
                    $('#bup').html(num);
                    $.get('/blog_detail_up/',{'id':{{ b_detail.id }},'num':num},function (data) {
                        console.log(data);
                    });
                });


                $('#b_down').click(function () {
                    let num = $('#bdown').html();
                    {#console.log(num);#}
                    num++;
                    $('#bdown').html(num);
                    $.get('/blog_detail_down/',{'id':{{ b_detail.id }},'num':num},function (data) {
                        console.log(data);
                    });
                });

            })
</script>
{% endblock %}

这里利用了ajax的get方法传了当前文章的id和点击数到后端去,然后后端开始操作——

blog_app应用下的urls.py

from django.conf.urls import include, url
from blog_app import views

urlpatterns = [
    url(r'^$',views.index),
    url(r'^index/$',views.index),
    url(r'^blog_list/$',views.blog_list),
    url(r'^blog_detail_(\d+)/$',views.blog_detail),
    
    url(r'^blog_detail_up/$',views.blog_detail_up),
    url(r'^blog_detail_down/$',views.blog_detail_down),
]

新增两条视图链接,分别指向up和down两个函数。

blog_app应用下的views.py

import re

from django.http import JsonResponse, HttpResponse
from django.shortcuts import render, get_object_or_404
from markdown.extensions.toc import TocExtension, slugify



from blog_app.models import *
import markdown


# Create your views here.
def index(request):
    return render(request, 'index.html')


# 获取列表
def blog_list(request):
    # 获取
    blist_info = BlogView.objects.all()
    b_order = blist_info.order_by('-id')  # 做个排序,按先后顺序来
    return render(request, 'blog_list.html', {'blist_info': blist_info, 'b_order': b_order})


def blog_detail(request, id):
    # dict1 = request.GET
    # b_detail = BlogView.objects.get(id=id)
    b_detail = get_object_or_404(BlogView,pk=id)
    b_detail.bread += 1
    b_detail.save()

	# 获取上下篇文章
    blog_prev = BlogView.objects.filter(id__lt=b_detail.id).last()
    blog_next = BlogView.objects.filter(id__gt=b_detail.id).first()


    return render(request, 'blog_detail.html', {'b_detail': b_detail,'blog_prev':blog_prev,'blog_next':blog_next})


def blog_detail_up(request):

    dict1 = request.GET
    id = dict1.get('id')
    b_up = dict1.get('num')
    b_detail = BlogView.objects.get(id=id)
    b_detail.bup = b_up
    b_detail.save()
    return JsonResponse({'b_detail':b_detail})


def blog_detail_down(request):

    dict1 = request.GET
    id = dict1.get('id')
    bdown = dict1.get('num')
    b_detail = BlogView.objects.get(id=id)
    b_detail.b_low = bdown
    b_detail.save()
    return JsonResponse({'b_detail':b_detail})

这里面还包含了获取上下篇文章的两条简简单单的代码,上面做了注释。

lt : 小于
gt : 大于

搜索栏

搜索栏也挺简单的,重点是前端的代码,在index的代码中,我从bootstrap里截来的导航栏里恰好把搜索栏写成了form提交表单,这时候只需要给它加上method和action,再给input框标记个name即可,理论上是可以用get方法,不过我用了post方法。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
    <script src="/static/js/jquery-1.12.4.min.js"></script>
</head>
<body>
<div class="container" style="width: 1170px">
    <nav class="navbar navbar-info">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="/">首页</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="/blog_list/">博客 <span class="sr-only">(current)</span></a></li>
        <li><a href="#">Link</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>
      </ul>
      <form class="navbar-form navbar-left" method="post" action="/blog_search/">
          {% csrf_token %}
        <div class="form-group">
          <input type="text" class="form-control" placeholder="搜索" name="search">
        </div>
        <button type="submit" class="btn btn-default">搜索</button>
      </form>


      <ul class="nav navbar-nav navbar-right">
          {% if request.session.buser_name %}
            <li style="margin: 0 auto;font-size: 16px;top:13px;width: 160px">
                欢迎您:<em>{{ request.session.buser_name }}</em>
                <a href="/login_flush/" style="float: right;top:-13px">注销</a>
            </li>
            {% else %}
              <li><a href="/login/">登录</a></li>
        {% endif %}

        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
          </ul>
        </li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container -->
</nav>



{% block content %}
<div class="jumbotron">
  <h1>Hello, world!</h1>
  <p>...</p>
  <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>
{% endblock %}
</div>




</body>
</html>

blog_search.html

改造一下blog_list.html即可食用。

{% extends 'blog_list.html' %}

{% block blog %}
<div class="b_list" style="margin-left: 0">
    {% if blog %}
        {% for foo in blog %}

            {% if foo.isDelete %}
                <p>不好意思,没找到你要的文章~</p>
            {% else %}
                <ul class="list-group">
                    <li class="list-group-item" style="height: 80px;border: 0;border-bottom: 1px #b9def0 solid">

                            <span class="badge">{{ foo.bread }}</span>
                            <a href="/blog_detail_{{ foo.id }}/" rel="external nofollow" style="font-size: 24px">{{ foo.btitle }}</a>


                        <div>
                            <div style="margin-top: 6px">
                                <span>
                                    <p style="font-size: 12px;float: left;margin-bottom: 0">创作于  {{ foo.bdata | date:'Y年m月d日' }}</p>
                                </span>
                            </div>

                            <div style="margin-left: 150px;opacity: 0.7;border: 0;height: 15px">
                                <span class="glyphicon glyphicon-thumbs-up" aria-hidden="true" style="height: 6px"></span> {{ foo.bup }}
                            </div>

                        </div>
                    </li>
                </ul>
            {% endif %}

        {% endfor %}
    {% else %}
        <p>不好意思,没找到你要的文章~</p>
    {% endif %}





</div>
{% endblock %}

blog_app应用下的urls.py

url(r'^blog_search/$',views.blog_search),

从这里开始就简写了,免得有水字数的嫌疑,反正如果全部做完了,所有的代码会一并放出来。

blog_app应用下的views.py

def blog_search(request):
    if request.method == 'GET':
        return render(request,'index.html')
    else:
        dict1 = request.POST
        search_title = str(dict1.get('search'))
        blog = BlogView.objects.filter(btitle__contains=search_title)
    return render(request,'blog_search.html',{'blog':blog})

展示页面

老样子——
在这里插入图片描述
在这里插入图片描述

待做

目前还有博主个人简介和个人简介栏、和我联系、博客分类(新想出来的,做不做还待定)、博主专用编辑发布页。。。可能还有,但目前想不到,这些是还没做的。

待完善的部分:点赞点踩次数限制、阅读次数限制、首页展示、搜索框快速列出关键字条目、blog_detail页面返回列表改成回滚等等。。

发现个问题,做的越多,需要完善的地方就越多,哪怕原本觉得没问题,也开始有问题了。

系列链接——

新手用python Django 创建个人博客的第一天

新手用python Django 创建个人博客的第二天

新手用python Django 创建个人博客的第三天

新手用python Django 创建个人博客的第四天

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值