最近开始学习老齐《Django实战》的内容,希望能够学会一些前端开发的知识,能够独立完成一些简单的界面编写。
在这里将操作过程及自己的笔记放在博客上,以备查阅和复习;
1.Django起步
1.1安装Django
sudo pip install Django
安装好后,可以先进入到Python的交互模式中,查看所安装的Django版本
import django
print(django.get_version)
基础设施已经建好,下面要创建项目了
1.2.创建项目
Django中的项目(project)可以看做是一个专有名词,因为后面还有一个与之有关的名词——应用(applicantion)
所谓“项目”,可以理解为一个网站
先规划好项目创建在什么地方,比如我放在桌面上,在终端输入:
~/mysite $ django-admin startproject mysite
看一下这个目录,多了一个mysite子目录,mysite就是项目名称
准备就绪,执行下述操作
$ python manage.py runserver
执行上述命令后,如果一切正常,最终会看到下面的提示信息:
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C
提示信息的第一行代码表示已经启动了一个服务,可以通过 http://127.0.0.1:8000/ 访问;提示信息的第二行代码说明了结束当前服务的方法——按Ctrl+C组合键。
1.3.创建应用
项目已经创建好,网站也有了,接下来要实现网站的具体功能。在Django中,人们把具体的功能成为“应用”(application)
在终端中进入到刚才创建的项目目录,即manage.py文件所在的目录,然后执行:
python manage.py startapp blog
执行了语句后,在目录中多了一个blog,其中有了默认的文件和目录。
blog就是在项目mysite中新建的一个应用。当新的应用创建后,Django会自动在这个应用中添加一些文件。
2.编写博客的数据模型类
设计数据库和表结构是做网站的基础。在Django中,我们不需要通过SQL语句直接跟数据库打交道,而是完全用Python的方式创建数据模型,之后交给Django完成数据库的操作。
2.1 数据模型类
利用Django开发网站系统,一般情况下,要先编写数据模型,就是在./blog/models.py中写一个类,这个类与数据库中的表具有对应关系。
下面就在./blog/models.py中编写博客的数据模型类Blog,本质上它是一个继承了django.db.models.Model的类
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class BlogArticles(models.Model):
title = models.CharField(max_length = 300)
#规定了字段title的属性为CharField类型,并以参数max_length=30的形式说明字段的最大数量
author=models.ForeignKey(User,related_name="blog_posts", on_delete=models.CASCADE)
#通过字段author规定了博客文章和用户之间的关系:一个用户对应多篇文章
#ForeignKey()就反映了这种“一对多”关系。
#类User就是BlogArticles的对应对象,
#related_name = "blog_post"允许类User反向查询到BlogArticles
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ("-publish",)
def __str__(self):
return self.title
执行python manage.py makemigrations
,简历数据库表,并在此基础上真正创建数据库,执行:python manage.py migrate
本项目使用SQLite数据库,并且在setting.py中规定了数据库文件存放在项目根目录中。这样就建立了博客的数据库——这是基础,接下来就是发布博客,并保存到这个数据库中。
2.2 发布博客文章
先用最简单的方式——使用Django默认的管理功能就可以发布文章。要使用此功能,必须先创建超级管理员,并牢记自己所使用的用户名和密码:
python manage.py createsuperuser
记住上面的用户名和密码,然后运行服务器,在地址栏输入http://127.0.0.1:8000/admin/,输入刚才的用户名和密码就可以进入系统。
用编辑工具打开./blog/admin.py,然后输入代码:
from django.contrib import admin
from .models import BlogArticles
admin.site.register(BlogArticles)
#将BlogArticles类引入到当前环境,然后注册到admin中
再进入到blog中,可以看到Blog articles,进入并选择“Add”添加博客文章。
在文章的列表页,可以看到所有已发布的文章标题。
为了让列表页信息丰富,还可以再admin.py中多写点东西:
from django.contrib import admin
from .models import BlogArticles
# Register your models here.
class BlogArticlesAdmin(admin.ModelAdmin):
list_display = ("title", "author", "publish")
list_filter = ("publish", "author")
search_fields = ("title", "body")
raw_id_fields = ("author",)
date_hierarchy = "publish"
ordering = ["publish", "author"]
admin.site.register(BlogArticles, BlogArticlesAdmin)
3.显示博客信息
将博客内容保存到数据库还不是发布博客的终极目的,之所以要在网上撰写博客,目的就是通过吸引他人关注达到自己的某种目的,所以,写博客一定要显示出来。
3.1 显示文章标题
要显示文章标题,就要把标题从数据库中读出来。在数据库中专门有一个title字段储存标题。如何读到具体内容?一种方法是通过SQL语句,另一种就是利用Django进行读取。当我们在models.py中创建了数据模型后,Django就会自动提供数据库抽象的API,通过这个API可以创建、获取、修改和删除对象。
下面写一个函数来专门读取文章标题,通常写在./blog/views.py中
from .models import BlogArticles
# Create your views here.
def blog_title(request):
blogs = BlogArticles.objects.all()
#得到所有BlogArticles实例
return render(request, "blog/titles.html", {"blogs":blogs})
#以return结束当前函数,并返回结果
像blog_title()这个函数,是在视图文件views.py中编写的一个函数,这种方式称之为“基于函数的视图”,这个函数被叫做“视图函数”。
在render中出现的titles.html就是标题列表的前端显示页面——被称为“模板”,在每个应用中都可以有一个专门的模板目录,现在进入blog的目录建立一个子目录templates,名称和位置都必须如此。
templates目录是Django磨人的存放本应用所需模板的目录,如果不用自定义的方式制定模板位置,Django就会在运行时自动来这里查找render函数中所制定的模板文件。
在模板目录中,有一个base.html文件,试讲所有模板中公共的部分抽取出来,在其他文件中只需要编写个性部分的代码。也就是说,在Django的模板文件中,是可以有“继承”功能的。本项目中,就这样来编写base.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>
<link rel="stylesheet" href="http://necolas.github.io/nomalize.css/">
<link rel="stylesheet" href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css">
head>
<body>
<div class="container">
{% block content %}
{% endblock %}
div>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js">script>
<script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js">script>
body>
html>
这就是一个基础模板,下面编写与标题列表相对应的模板,即./templates/blog/titles.html文件:
<html lang="zh-cn">
{% extends "base.html" %}
{% block title %}blog titles{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>我的博客h1>
div>
<div class="row">
<div class="col-xs-12 col-md-8">
<ul>
{% for blog in blogs %}
<li><a href="{{ blog.id }}">{{ blog.title }}a>li>
{% endfor %}
ul>
div>
<div class="col-xs-6 col-md-4">
<h2>刘克凡h2>
<p>哇塞这居然是我自己搞出来的博客!p>
<img width="200px" src="http://www.v3wall.com/wallpaper/1920_1080/1207/1920_1080_20120723011137532854.jpg">
div>
div>
{% endblock %}
函数和模板都编写好之后,要想通过网页访问,还需要做好另外一项重要的工作,就是进行URL配置。首先配置./mysite/urls.py,在这个文件中配置本项目的各个应用。
from django.contrib import admin
from django.conf.urls import url, include
from django.urls import re_path
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls'))
]
接下来配置./blog/urls.py中的URL,需要先创建,然后配置:
from django.conf.urls import url
from . import views
app_name = 'blog'
urlpatterns = [
url(r'^$', views.blog_title, name="blog_title"),
]
现在就可以打开浏览器,输入地址http://127.0.0.1:8000/blog/,效果如下图:
显示文章标题的目的已经实现,有了标题就可以查看文章了。
3.2 查看文章内容
文章标题还需要做超链接,对象就是文章详情页,对此应该在titles.html中显示标题的部分做相应修改:
{% for blog in blogs %}
<li><a href="{{ blog.id }}">{{ blog.title }}a>li>
{% endfor %}
这时候每个标题都有了超链接,但点击还不能显示详情,需要做后续工作。
创建./templates/blog/content.html文件:
{% extends "base.html" %}
{% block title %}blog titles{% 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-8">
<p class="text-center"><span>{{ article.author.username }}span><span
style="margin-left:20px">{{ publish }}span>p>
<div>{{ article.body }}div>
div>
<div class="col-xs-6 col-md-4">
<h2>刘克凡h2>
<p>哇塞这居然是我自己搞出来的博客!p>
<img width="200px" src="http://www.v3wall.com/wallpaper/1920_1080/1207/1920_1080_20120723011137532854.jpg">
div>
div>
{% endblock %}
接着配置URL,因为还是针对blog这个应用而言,所以只需要在./blog/urls.py中增加新的url路径。
from django.conf.urls import url
from . import views
app_name = 'blog'
urlpatterns = [
url(r'^$', views.blog_title, name="blog_title"),
url(r'(?P\d)/$' , views.blog_article, name="blog_detail"),
]
至此,一个博客就创建完成了,虽然简陋,但显示了Django在网站开发中的基本结构,为以后较复杂的开发奠定了基础。
“道路是曲折的,前途是光明的”,后续还有挑战。