美文网首页
三、显示博客信息

三、显示博客信息

作者: 途中的蜗牛 | 来源:发表于2020-12-30 09:01 被阅读0次

1、models.py

我们在上一节中已经介绍过了models.py数据表结构的生成。

2、views.py

当我们在./blog/models.py中定了数据表之后,Django会提供数据库抽象的API(也叫ORM,Object-Relational Mapper),通过该API就可以创建、获取、修改和删除对象。
该API通常被写在./blog/views.py文件,现在我们先用它来查询数据库文件。

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

def blog_title(request):  # 参数request不可少,位于第一位置
    blogs = BlogArticles.objects.all()  # 获取BlogArticles中所有记录
    return render(request, 'blog/titles.html', {'blogs':blogs})
    # 将数据渲染到html页面上,第一个参数必须是request,第二个是html模板位置,最后一个是所传送的数据,必须以字典形势。

3、templates

在./blog文件夹下面创建子文件夹templates(包含base.html和blog文件夹(含有titles.html))
base.html是所有模板中公共的部分。其他的文件如title.html只需要包含个性化部分的代码。
(1)base.html是所有模板中公共的部分,代码如下:

<!DOCTYPE html> 
<html lang="zh-cn"> 
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <title>{% block title %}{% endblock %}</title>   <!-- django的块标签 -->
    <link rel="stylesheet" href="https://github.com/necolas/normalize.css/blob/master/normalize.css"> 
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
</head>
<body>
    <div class="container">
        {% block content %}
        {% endblock %}   <!-- django的块标签 -->
    </div>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script> 
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"> </script>
</body>
</html>

{%block name%} {%endblock%} 是Django中的块,用来包裹其他个性化模板如title中所自定义的内容。
(2)titles.html只需要包含个性化部分的代码,也就是填写block中的内容,代码如下:

{% extends "base.html" %}   <!-- 继承了模板 base.html -->
{% block title %}blog titles{% endblock %}  <!-- block title在base.html中定义 -->
{% block content %}  <!-- block content在base.html中定义 -->
<div class="row text-center vertical-middle-sm">
    <h1>我的博客</h1> 
</div>
<div class="row">
    <div class="col-xs-12 col-md-12"> 
    <ul>
    {% for blog in blogs %}    <!-- django 块变量 -->
        <li><a href="{{ blog.id }}">{{ blog.title }}</a></li>   <!-- 引用的数据 -->
    {% endfor %}
    </ul>
    </div>
</div>
{% endblock %}

4、配置URL

4.1 配置本项目的url,修改./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')),  # namespace为在跳转的html页面中django所引用的变量名,可以表示本链接的地址
]

4.2配置本应用blog的url,修改./blog/urls.py

from django.urls import path
from . import views

app_name = "blog"

urlpatterns = [
    path("", views.blog_title, name='blog_title'),
]

综上,就可以使用http://127.0.0.1:8000/blog/来访问博客列表信息了

5、显示文章内容

5.1 在title.html中显示标题的链接

    {% for blog in blogs %}    <!-- django 块变量 -->
        <li><a href="{{ blog.id }}">{{ blog.title }}</a></li>   <!-- 引用的数据 -->
    {% endfor %}

5.2 修改views.py,增加查看文章详情请求的函数

def blog_article(request, article_id):  # 该 函数多了一个参数article_id
    #article = BlogArticles.objects.get(id=article_id)
    article = get_object_or_404(BlogArticles, id=article_id)
    pub = article.publish
    return render(request, "blog/content.html", {"article":article, "publish":pub })

5.3 增加content.html

{% extends "base.html" %}
{% block title %}blog article{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>{{ article.title }}</h1> 
</div>
<div class="row">
    <div class="col-xs-12 col-md-12">
        <p class="text-center"><span>{{ article.author.username }} 
            </span><span style="margin-left:20px">{{ publish }}</span>
        </p>
<div>{{ article.body }}</div> 
    </div>
</div>
{% endblock %}

5.4 配置url

因为该需求还是针对blog这个应用而言,所以不需求修改./mysite/urls.py,只需要在./blog/urls.py文件中增加新的url路径即可。

from django.urls import path
from . import views

app_name = "blog"

urlpatterns = [
    path("", views.blog_title, name='blog_title'),
    path('<int:article_id>/', views.blog_article, name='blog_article'),
]

5.5 当从数据库呈现文本时,Django不显示换行符

在HTML中,换行符只是另一个空格,它并不意味着将以下文本放在一个新行上。有很多方法强制在HTML中的新行。
(1)可以用< pre>标签,以便HTML能够理解它是预格式化的:

<pre>{{value}}</pre>

(2)可以使用Django过滤器将纯文本换行转换为HTML。换行符将单个换行符变为< br>标签和双换行符到< p>标签。 linebreaksbr只是将换行符变成< br>标签:

{{value|linebreaks}}
{{value|linebreaksbr}}

参考文献:
1、跟老齐学python:Django实战

相关文章

网友评论

      本文标题:三、显示博客信息

      本文链接:https://www.haomeiwen.com/subject/tgmqoktx.html