Django搭建简易博客教程(八)-动态URL
admin
2023-07-30 20:41:34
0

整个项目已经放在Github上, 随时更新, 项目地址


动态URL


运行已经做好的博客框架, 会发现一个问题, 只有一个主页的空盒子, 而大部分时候我们希望能够让每篇博客文章都有一个独立的页面.

我第一个想到的方法是给每篇博客文章加一个view函数逻辑, 然后设置一个独立的url(我不知道语言比如PHP, 或者web框架rail等是如果解决的, 我是第一次仔细的学习web框架, 也没有前端开发经验), 但是这种方法耦合性太强, 而且用户不友好, 缺点非常多

Django给我们提供了一个方便的解决方法, 就是动态URL

现在修改my_blog/article/views.py代码:

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from article.models import Article
from datetime import datetime
from django.http import Http404

# Create your views here.
def home(request):
    post_list = Article.objects.all()  #获取全部的Article对象
    return render(request, \'home.html\', {\'post_list\' : post_list})

def detail(request, id):
    try:
        post = Article.objects.get(id=str(id))
    except Article.DoesNotExist:
        raise Http404
    return render(request, \'post.html\', {\'post\' : post})

因为id是每个博文的唯一标识, 所以这里使用id对数据库中的博文进行查找

在my_blog/my_blog/urls.py中修改url设置:

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'article.views.detail\', name=\'detail\'),
)#39;, \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'article.views.detail\', name=\'detail\'),
)#39;, \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(\'\',
    # Examples:
    # url(r\'^$\', \'my_blog.views.home\', name=\'home\'),
    # url(r\'^blog/\', include(\'blog.urls\')),

    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^$\', \'article.views.home\', name = \'home\'),
    url(r\'^(?P\\d+)/$\', \'article.views.detail\', name=\'detail\'),
)
#39;, \'article.views.detail\', name=\'detail\'),
)#39;, \'article.views.detail\', name=\'detail\'),
)

然后在templates下建立一个用于显示单页博文的界面:

#post.html
{% extends \"base.html\" %}

{% block content %}

{{ post.title }}

Time: {{ post.date_time|date:\'Y /m /d\'}} {{ post.category }}

{{ post.content }}

{% endblock %}

可以发现只需要对home.html进行简单的修改, 去掉循环就可以了.

修改home.html和base.html, 加入动态链接和主页, 归档, 专题和About Me按钮


{% extends \"base.html\" %}

{% block content %}
{% for post in post_list %}

{{ post.title }}

Time: {{ post.date_time |date:\'Y /m /d\'}} {{ post.category }}

{{ post.content }}

Read More >>>
{% endfor %}
{% endblock %}




    



    Andrew Liu Blog
    
    
    



{% block content %} {% endblock %}

其中主要改动

  • 添加了几个导航按钮, 方便以后添加功能(暂时不添加登陆功能)
  • 添加read more按钮
  • 在博客文章的增加一个链接, 链接的href属性为{% url \'detail\' id=post.id %}, 当点击这个文章题目时, 会将对应的数据库对象的id传入的url中, 类似于url传参, 不记得的同学可以重新回到前几页翻一下. 这里将数据库对象唯一的id传送给url设置, url取出这个id给对应的view中的函数逻辑当做参数. 这样这个id就传入对应的参数中被使用

比如: 点击到的博客文章标题的对象对应的id=2, 这个id被传送到name=detail的url中, \'^(?P\\d+)/

比如: 点击到的博客文章标题的对象对应的id=2, 这个id被传送到name=detail的url中, \'^(?P\\d+)/\'^(?P\\d+)/$\'#39;正则表达式匹配后取出id, 然后将id传送到article.views.detail作为函数参数, 然后通过get方法获取对应的数据库对象, 然后对对应的模板进行渲染, 发送到浏览器中..

#39;正则表达式匹配后取出id, 然后将id传送到article.views.detail作为函数参数, 然后通过get方法获取对应的数据库对象, 然后对对应的模板进行渲染, 发送到浏览器中..

此时重新运行服务器, 然后在浏览器中输入http://127.0.0.1:8000/点击对应的博客文章题目, 可以成功的跳转到一个独立的页面中

博客
博客

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...