博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用django-bootstrap开发个人博客
阅读量:3967 次
发布时间:2019-05-24

本文共 8240 字,大约阅读时间需要 27 分钟。

项目运行在centos7

首先搭建开发环境

创建django项目并使用venv创建虚拟环境并激活

django-admin startproject centosdjangocd centosdjangopython3 -m venv venvsource venv/bin/activate

同时在虚拟环境中安装一些必要的第三方库文件:

pip install django==2.0pip install pillowpip install pymysqlpip install requests

创建并注册功能模块app

python manage.py startapp myblog

同时在项目文件夹中修改settings.py文件:

# Application definition INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'myblog']

修改urls.py文件,将功能模块app的访问路径配置进去:

from django.contrib import adminfrom django.urls import path ,include urlpatterns = [    path('admin/', admin.site.urls),    path('myblog/', include('myblog.urls', namespace='article')),]

这里要注意的是在生成的app路径下面并没有urls.py文件,需要自己去手动配置。

# 引入pathfrom django.urls import path # 正在部署的应用的名称app_name = 'myblog' urlpatterns = [    ]

建立个人博客的数据模型model

介绍django框架的MVT模式,即django主要关注的就是模型(model),视图(view),模板(templates)

层次 职责
模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
模板(Template),即业务逻辑层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即表现层 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

简单来说就是Model存取数据,View决定需要调取哪些数据,而Template则负责将调取出的数据以合理的方式展现出来。

下面我们建立项目的数据存取层与表现层。

存放文章的数据模型:

from django.db import models # Create your models here.from django.db import modelsfrom django.contrib.auth.models import Userfrom django.utils import timezone #博客文章数据模型 class ArticlePost(models.Model):    # 文章作者,参数 on_delete 用于指定数据删除的方式    author = models.ForeignKey(User,on_delete=models.CASCADE)     # 文章标题。models.CharField 为字符串字段,用于保存较短的字符串,比如标题    title = models.CharField(max_length=100)     # 文章正文。保存大量文本使用 TextField    body = models.TextField()     # 文章创建时间。参数 default=timezone.now 指定其在创建数据时将默认写入当前的时间    created = models.DateTimeField(default=timezone.now)     # 文章更新时间。参数 auto_now=True 指定每次数据更新时自动写入当前时间    updated = models.DateTimeField(auto_now=True)    # 内部类 class Meta 用于给 model 定义元数据    class Meta:        # ordering 指定模型返回的数据的排列顺序        # '-created' 表明数据应该以倒序排列        ordering = ('-created',)     # 函数 __str__ 定义当调用对象的 str() 方法时的返回值内容    def __str__(self):        # return self.title 将文章标题返回        return self.title

并通过django进行数据迁移将模型转换为数据库中对应的二维表。

在这个项目中并没有使用django自带的db.sqlite3,而是换成了mysql,这样虽然需要在mysql手动创建一个数据库,但在mysql中还是可以直接操作数据库数据比较方便的。

python manage.py makemigrations myblogpython manage.py migrate

每当你修改了models.py文件,都需要用makemigrationsmigrate这两条指令迁移数据。

如果要改成使用mysql数据库那么就需要修改两个文件,项目文件夹下的settings.py文件与__init__.py文件

#settings.pyDATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', 'NAME': 'oa', 'HOST': '1.2.3.4', 'PORT': 3306, 'USER': 'yourname', 'PASSWORD': 'yourpass', }}#__init__.pyimport pymysqlpymysql.install_as_MySQLdb()

迁移完数据模型之后,还需要在后台管理admin中注册数据模型,这样可以在后台中直接修改管理模型得数据。

admin.py 在app目录中

from django.contrib import admin # 别忘了导入ArticlerPostfrom .models import ArticlePost # 注册ArticlePost到admin中admin.site.register(ArticlePost)

这时候创建一个超级用户登录后台即可进行模型数据的更新修改,并同步到MySQL数据库。

python manage.py createsuperuser

编写与模板页配套的视图函数。

视图函数views.py

from django.shortcuts import render# 引入redirect重定向模块from django.shortcuts import render, redirect# 引入HttpResponsefrom django.http import HttpResponse# 引入刚才定义的ArticlePostForm表单类from .forms import ArticlePostForm# 引入User模型from django.contrib.auth.models import Userfrom myblog.models import ArticlePostimport markdowndef article_list(request):    # 取出所有博客文章    articles = ArticlePost.objects.all()    # 需要传递给模板(templates)的对象    context = {
'articles': articles } # render函数:载入模板,并返回context对象 return render(request, 'posts/list.html', context)def article_detail(request,id): article = ArticlePost.objects.get(id=id) #markdown渲染 article.body = markdown.markdown(article.body, extensions=[ # 包含 缩写、表格等常用扩展 'markdown.extensions.extra', # 语法高亮扩展 'markdown.extensions.codehilite', ]) context = {
'article':article} return render(request,'posts/detail.html',context)# 写文章的视图def article_create(request): # 判断用户是否提交数据 if request.method == "POST": # 将提交的数据赋值到表单实例中 article_post_form = ArticlePostForm(data=request.POST) # 判断提交的数据是否满足模型的要求 if article_post_form.is_valid(): # 保存数据,但暂时不提交到数据库中 new_article = article_post_form.save(commit=False) # 指定数据库中 id=1 的用户为作者 # 如果你进行过删除数据表的操作,可能会找不到id=1的用户 # 此时请重新创建用户,并传入此用户的id new_article.author = User.objects.get(id=1) # 将新文章保存到数据库中 new_article.save() # 完成后返回到文章列表 return redirect("article:article_list") # 如果数据不合法,返回错误信息 else: return HttpResponse("表单内容有误,请重新填写。") # 如果用户请求获取数据 else: # 创建表单类实例 article_post_form = ArticlePostForm() # 赋值上下文 context = {
'article_post_form': article_post_form } # 返回模板 return render(request, 'posts/create.html', context)

为视图函数编写表单模型form.py

# 引入表单类from django import forms# 引入文章模型from .models import ArticlePost # 写文章的表单类class ArticlePostForm(forms.ModelForm):    class Meta:        # 指明数据模型来源        model = ArticlePost        # 定义表单包含的字段        fields = ('title', 'body')

配置app目录的urls.py

from django.urls import pathfrom . import viewsapp_name = "myblog"urlpatterns = [    path('article-list/', views.article_list, name='article_list'),       path('article-detail/
/', views.article_detail, name='article_detail'), path('article-create/', views.article_create, name='article_create'),]

编写模板页

模板页目录结构为:

templates

├─base.html #博客渲染,所有网页从此继承
├─header.html #头部即为网站导航栏
├─footer.html #底部注脚
└─article

├─list.html #博客首页,用来展览所有的文章

├─create.html #写文章页面,要注意的是作者项目默认为了id为1的Auspic
└─detail.html #文章详情页面

在模板页中需要注意的是使用的bootstrap与jquery等都是静态资源从服务器端引用,而不是直接cdn引用。

模板页中引用的静态资源的目录:

static

└─bootstrap
│ ├─css # 文件夹
│ └─js # 文件夹
└─jquery
│ └─jquery-3.3.1.js # 文件
└─popper
└─popper-1.14.4.js # 文件

base.html

{% load staticfiles %}
{% block title %}{% endblock %}
{% include 'header.html' %}
{% block content %}{% endblock content %}
{% include 'footer.html' %}

footer.html

Copyright © www.dusaiphoto.com 2018

header.html

list.html

{% extends "base.html" %}{% load staticfiles %}
{% block title %} 首页{% endblock title %}
{% block content %}
{% for article in articles %}

{
{ article.title }}

{ { article.body|slice:'100' }}...

{% endfor %}
{% endblock content %}

detail.html

{% extends "base.html" %}{% load staticfiles %}
{% block title %} 文章详情{% endblock title %}
{% block content %}

{
{ article.title }}

作者:{
{ article.author }}

{

{ article.body|safe }}

{% endblock content %}

create.html

{% extends "base.html" %} {% load staticfiles %}
{% block title %} 写文章 {% endblock title %}
{% block content %}
{% csrf_token %}
{% endblock content %}

最后挂上新博客地址:

转载地址:http://cncki.baihongyu.com/

你可能感兴趣的文章
cookie、session、sessionid 与jsessionid[转]
查看>>
常见Oracle HINT的用法
查看>>
JAVA中各类CACHE机制实现的比较 [转]
查看>>
PL/SQL Developer技巧
查看>>
3-python之PyCharm如何新建项目
查看>>
15-python之while循环嵌套应用场景
查看>>
17-python之for循环
查看>>
18-python之while循环,for循环与else的配合
查看>>
19-python之字符串简单介绍
查看>>
20-python之切片详细介绍
查看>>
P24-c++类继承-01详细的例子演示继承的好处
查看>>
P8-c++对象和类-01默认构造函数详解
查看>>
P1-c++函数详解-01函数的默认参数
查看>>
P3-c++函数详解-03函数模板详细介绍
查看>>
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
ksh 命令分隔符
查看>>