• Django之路第六篇:完善博客


    博客页面设计

    博客页面概要

    • 博客主页面

    • 博客文章内容页面

    • 博客撰写页面

    博客主页面

    主页面内容

    • 文章标题列表,超链接

    • 发表博客按钮(超链接)

    列表编写思路

    • 取出数据库中所有文章对象

    • 将文章对象们打包成列表,传递到前端

    • 前端页面把文章以标题超链接的形式逐个列出

    For循环模板

    {% for xx in xxs %}

      HTML语句

    {% endfor %}

    修改后的博客主页views.py:

    1 from django.shortcuts import render
    2 from django.http import HttpResponse
    3 from . import models
    4 def index(request):
    5     # 获取所有的条数
    6     articles = models.Article.objects.all()
    7     return render(request,'blog/index.html',{'articles':articles})

    修改后的博客主页index.html

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8 
     9     <h1><a href="">新文章</a></h1>
    10     {% for article in articles %}
    11         <a href="">{{ article.title }}</a>
    12         <br/>
    13     {% endfor %}
    14 
    15 </body>
    16 </html>

     博客文章页面

    • 标题

    • 文章内容

    • 修改文章按钮(超链接)

    1.在blog中的views.py添加响应函数article_page():

    1 # blog/views.py
    2 
    3 from django.shortcuts import render
    4 from django.http import HttpResponse
    5 from . import models
    6 
    7 def article_page(request,article_id):
    8     article = models.Article.objects.get(pk=article_id)
    9     return render(request,'blog/article_page.html',{'article':article})

    2.在模板templates中添加文章详情页面article_page.html:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Article Page</title>
     6 </head>
     7 <body>
     8     <h1>{{ article.title }}</h1>
     9     <br/>
    10     <h3>{{ article.content }}</h3>
    11     <br/>
    12     <a href="">修改文章</a>
    13 </body>
    14 </html>

    3.在blog/urls.py添加文章详情路由:

    1 # blog/urls.py
    2 
    3 from django.conf.urls import url
    4 from . import views
    5 
    6 urlpatterns = [
    7     url('^index/$',views.index),
    8     url('^article/(?P<article_id>[0-9]+)$',views.article_page)
    9 ]

    URL传递参数

    • 参数写在响应函数中request后,可以有默认值

    • URL正则表达式:r'^/article/(?P<article_id>[0-9]+)/$'

    • URL正则中的组名必须和参数名一致

     Django中的超链接

    超链接目标地址

    • href后面是目标地址

    • template中可以用"{% url 'app_name:url_name' param %}" (app_name:应用命名空间;url_name:链接名称)其中app_name和url_name都在url中配置

    url函数的名称参数

    • 根urls,写在include()的第二个参数位置,namespace = 'blog'

    • 应用下则写在url()的第三个参数位置,name = 'article'

    主要取决于是否使用include引用了另一个url配置文件

    修改后的myblog/urls.py文件如下:

    1 from django.contrib import admin
    2 from django.urls import path,include
    3 urlpatterns = [
    4     path('admin/', admin.site.urls),
    5     path('blog/', include('blog.urls',namespace='blog')),
    6 ]

    修改后的blog/urls.py文件如下:

    1 from django.conf.urls import url
    2 from . import views
    3 app_name = 'blog'
    4 urlpatterns = [
    5     url('^index/$',views.index),
    6     url('^article/(?P<article_id>[0-9]+)$',views.article_page,name='article_page')
    7 ]

    在这里请注意,一定要在应用下的urls.py文件中加上app_name = 'app_name',不然会报错不通过。

    最后就应该修改主页文章链接:

     1 <head>
     2     <meta charset="UTF-8">
     3     <title>Title</title>
     4 </head>
     5 <body>
     6     <h1><a href="">新文章</a></h1>
     7     {% for article in articles %}
     8         <a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>
     9         <br/>
    10     {% endfor %}
    11 
    12 </body>
    13 </html>

    博客编辑撰写页面

    页面内容

    • 标题编辑栏

    • 文章内容编辑区域

    • 提交按钮

    第一步:在blog应用下的模板中建立edit_page.html文件,并编辑页面得到如下:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Edit Page</title>
     6 </head>
     7 <body>
     8 <form action="" method="post">
     9     <label>
    10         文章标题
    11         <input type="text" name="title"/>
    12     </label>
    13     <br>
    14     <label>
    15         文章内容
    16         <input type="text" name="content"/>
    17     </label>
    18     <br>
    19     <input type="submit" value="提交">
    20 </form>
    21 </body>
    22 </html>

    第二步:在应用下的views.py文件中添加页面渲染函数edit_page()后如下:

     1 from django.shortcuts import render
     2 from . import models
     3 def index(request):
     4     # 获取所有的条数
     5     articles = models.Article.objects.all()
     6     return render(request,'blog/index.html',{'articles':articles})
     7 
     8 def article_page(request,article_id):
     9     article = models.Article.objects.get(pk=article_id)
    10     return render(request,'blog/article_page.html',{'article':article})
    11 
    12 def edit_page(request):
    13     return render(request,'blog/edit_page.html')

    第三步:在应用下的urls.py文件中配置编辑页面的路由如下:

    1 from django.conf.urls import url
    2 from . import views
    3 app_name = 'blog'
    4 urlpatterns = [
    5     url('^index/$',views.index),
    6     url('^article/(?P<article_id>[0-9]+)$',views.article_page,name='article_page'),
    7     url('^edit/$',views.edit_page)
    8 ]

    这个时候可以直接在浏览器输入url访问edit_page.html页面了

    编辑响应函数

    • 使用request.POST['参数名']获取表单数据

    • models.Article.object.create(title,content)创建对象

     两个编辑页面

    思路

    • 新文章为空,而修改得文章是有内容的

    • 修改文章页面有文章对象

    • 文章的ID

    为了去区分两个编辑页面,所以这里采用带id的方式,新建编辑页面的id=0,而修改编辑页面的id还是原来的id,则:

    修改后的views.py的edit_page()函数:

    1 def edit_page(request,article_id):
    2     if str(article_id)=='0':
    3         return render(request,'blog/edit_page.html')
    4     article = models.Article.objects.get(pk=article_id)
    5     return render(request,'blog/edit_page.html',{'article':article})

    同时给路由添加参数:

     1 url('^edit/(?P<article_id>[0-9]+)$',views.edit_page,name='edit_page'), 

    将编辑页面修改为:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Edit Page</title>
     6 </head>
     7 <body>
     8 <form action="{% url 'blog:edit_action' %}" method="post">
     9     {% csrf_token %}
    10     {% if article %}
    11     <label>
    12         文章标题
    13         <input type="text" name="title" value="{{ article.title }}"/>
    14     </label>
    15     <br>
    16     <label>
    17         文章内容
    18         <input type="text" name="content" value="{{ article.content }}"/>
    19     </label>
    20     <br>
    21     {% else %}
    22     <label>
    23         文章标题
    24         <input type="text" name="title"/>
    25     </label>
    26     <br>
    27     <label>
    28         文章内容
    29         <input type="text" name="content"/>
    30     </label>
    31     <br>
    32     {% endif %}
    33     <input type="submit" value="提交">
    34 </form>
    35 </body>
    36 </html>

    通过以上修改,就可以实现编辑页面的页面效果响应,但是最后的提交事件响应也得跟着改。

    因此,可以再编辑页面添加如下input标签对后台传值:

    1 <input type="hidden" name="article_id" value="{{ article.id }}">

    此时就应该修改views.py文件中的edit_action()函数:

     1 def edit_action(request):
     2     title = request.POST.get('title','TITLE')
     3     content = request.POST.get('content','CONTENT')
     4     article_id = request.POST.get('article_id','0')
     5 
     6     if article_id == '0':
     7         articles = models.Article.objects.all()
     8         models.Article.objects.create(title = title,content = content)
     9         return render(request, 'blog/index.html', {'articles': articles})
    10 
    11     article = models.Article.object.get(pk=article_id)
    12     article.title = title
    13     article.content = content
    14     article.save()
    15     return render(request, 'blog/article_page.html', {'article': article})

    当前的工程目录结构

    myblog

      |-----blog(应用目录)

        |-----migrations(数据移植模块,内容自动生成)

          |------__init__.py

        |-----templates

          |-----blog

            |-----index.html(主页面)

            |-----article_page.html(文章详情页面)

            |-----edit_page.html(编辑文章页面)

        |-----__init__.py

        |-----admin.py(应用的后台管理系统配置)

        |-----apps.py(应用的一些配置)

        |-----models.py(数据模块,类似于MVC结构中的Models(模型))

        |-----tests.py(自动化测试模块)

        |-----views.py(执行响应的代码所在模块)

        |-----urls.py(新增路由文件)

      |-----myblog(项目目录)

        |-----__init__.py

        |-----settings.py(项目中的总配置文件)

        |-----urls.py(URL配置文件)

        |-----wsgi.py(Python应用与Web服务器之间的接口)

      |-----db.sqlite3(数据库文件)

      |-----manage.py(与项目进行交互的命令行工具集入口(项目管理器))

    到这里博客的基本功能就已经完成了,接下来就需要根据自己的实际情况进行开发和优化了,有疑问和建议的可以底下留言哦!

    我后面也会把开发完成的博客上线的,并且继续分享开发过程中的一些重要知识点,到时候欢迎各位继续访问!

  • 相关阅读:
    LeetCode: Maximum Product Subarray 解题报告
    LeetCode: Populating Next Right Pointers in Each Node II 解题报告
    LeetCode: Populating Next Right Pointers in Each Node 解题报告
    LeetCode: Word Search 解题报告
    C语言文件操作
    多线程
    C语言函数指针的使用
    进程
    网络编程
    进程间通信——管道通信
  • 原文地址:https://www.cnblogs.com/wanghao123/p/8004113.html
Copyright © 2020-2023  润新知