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实战
网友评论