6月份作业之如何使用Django开发个人博客?

前言

在学习Python的过程中,觉得有必要学一学Python做web开发,而django作为一种优秀的Python Web框架,自然成为了我的首选,经过不到一个月的学习,总算搞清楚了django的大部分结构和基本的语法,如果你想学django,就和我一起来做一个用django开发的小型个人博客吧!

了解django

django是遵循MVC设计模式的框架,MVC是Model、View、Controller这三个单词的缩写,分别代表了模型,视图,控制器。对于我个人的理解来讲,模型用来与数据库进行交互,视图用来封装html、js、css,控制器则用来处理程序的请求、逻辑结构等。

准备工作

Python3+django2.0+PycharmPro2018

创建项目

你可以使用Pycharm创建,更加方便。你也可以使用命令行创建,,当然前提是你已经安装了django,并且cd到了你想把项目创建到哪个目录的具体位置。一行命令创建了一个myblog的项目,接下来我们就该创建app了,先来讲下app与项目之间的关系。

项目和app之间的关系

对于django来说,项目只是一个大框架,他的具体功能还需要在app里面实现,app所对应的就是一个一个的功能模块,比如拿chabug来说,有用户模块,也有文章模块,也有专题模块。你可以进入到项目的目录,然后这样来创建app

运行

项目结构

URL与视图

视图视图一般写在APP的views.py中,并且第一个参数永远是对象,这个对象包含了一些请求信息,比如:请求方法GET、POST,头部headers信息等等,然后视图必须返回一个,比如下面这个:

fromdjango.shortcutsimportrender,HttpResponse

defhello(request):

returnHttpResponse("hello")当然,你现在并不能在浏览器中看到返回的,因为我们还没有定义urls.py中的内容,下面就跟我来配置一波把!URL映射这是默认的配置,其中admin这一条是django系统自带的映射后台,不用管他。我们来添加一条url来映射我们的hello,首先从app导入views.py

formblogimportviews然后添加一条映射关系django会自动从中寻找当前请求url所对应的规则,返回相应的信息。这个时候在访问127.0.0.1:8000则会出现我们在视图中返回的HttpResponse信息

URL传参

两种方法views.py

defA(request,id):

text="你请求的id是:%s "%id

returnHttpResponse(text)urls.py

fromdjango.contribimportadmin

fromdjango.urlsimportpath

fromblogimportviews

urlpatterns= [

path('admin/',admin.site.urls),

path('',views.hello),

path('A/',views.A),

]你可以这样访问第二种views.py

defB(request):

id=request.GET.get['id']

text="你请求的id是:%s "%id

returnHttpResponse(text)urls.py

fromdjango.contribimportadmin

fromdjango.urlsimportpath

fromblogimportviews

urlpatterns= [

path('admin/',admin.site.urls),

path('',views.hello),

path('B/',views.B),

]你可以这样访问 127.0.0.1:8000/B/?id=1URL反转之前我们都是通过url来访问视图函数。有时候我们知道这个视图函数,但是想反转回他的url。这时候就可以通过来实现。示例代码如下:

reverse("list")

>/book/list/传递参数

reverse("book:detail",kwargs={"book_id":1})

>/book/detail/1URL和视图我们就暂时讲到这里,接下来我们要开始写了,模板的知识会融在其中。

创建模型

fromdjango.dbimportmodels

classArticle(models.Model):

title=models.CharField(max_length=50)#文章标题

category=models.CharField(max_length=50,blank=True)#文章分类

datetime=models.DateTimeField(auto_now_add=True)#文章发表日期

content=models.TextField(blank=True,null=True)#文章内容

def__str__(self):

returnself.title

classMeta:

ordering= ['-datetime']#以日期倒序创建完模型后我们需要把模型同步到数据库中

python3 manage.py makemigrations

python3 manage.py migrate然后在admin.py中注册下我们创建的模型注册模型让我们在django自带的后台管理中显示出来127.0.0.1:8000/admin发布文章什么的都可以在这操作。

URL设计

我直接贴我的代码

fromdjango.contribimportadmin

fromdjango.urlsimportpath

fromblogimportviews

urlpatterns= [

path('admin/',admin.site.urls),

path('',views.index,name='index'),

path('/',views.detail,name='detail'),

path('archives/',views.archives,name='archives'),

path('tag/',views.tags,name='tag'),

path('search/',views.search,name='search')

]

视图设计

fromdjango.shortcutsimportrender,redirect

fromblog.modelsimportArticle

fromdjango.httpimportHttp404

# 首页视图,展示所有的文章

defindex(request):

sessionid=request.COOKIES.get('sessionid')

post_list=Article.objects.all()

returnrender(request,'index.html',{'post_list':post_list,'sessionid':sessionid})

#文章详情视图,展示详细的文章内容

defdetail(request,id):

try:

post=Article.objects.get(id=id)

except:

raiseHttp404

returnrender(request,'post.html',{'post':post})

#文章归档

defarchives(request):

try:

post_list=Article.objects.all()

exceptArticle.DoesNotExist:

raiseHttp404

returnrender(request,'archives.html', {'post_list':post_list,'error':False})

#分类作为标签,展示同分类下的文章

deftags(request,tag):

post_list=Article.objects.filter(category__iexact=tag)

returnrender(request,'tags.html', {'post_list':post_list})

#搜索

defsearch(request):

if's'inrequest.GET:

s=request.GET['s']

ifnots:

returnrender(request,'index.html')

else:

post_list=Article.objects.filter(title__icontains=s)

iflen(post_list)==:

returnrender(request,'archives.html',{'post_list':post_list,'error':True})

else:

returnrender(request,'archives.html',{'post_list':post_list,'error':False})

returnredirect('index')

模板设计

父模板导航条完成

{% load static %}

Index{% block title %} - MyBlog{% endblock %}

{% block head %}{% endblock %}

img{

margin-top:-20px;

max-height:60px;

max-width:150px;

}

.panel-body{

width:750px;

margin-left:auto;

margin-right:auto;

}

首页(current)

归档

搜索

{% block nav %}

{% if sessionid %}

进入后台

{% else %}

登陆

{% endif %}

{% endblock %}

{% block content %}

{% endblock %}

Copyright © 2013 ChaBug. All Rights Reserved.

首页完成

{% extends 'base.html' %}

{% block content %}

{% for post in post_list %}

{{ post.title }}

Time:{{ post.datetime|date:"Y-m-d" }}

分类:{{ post.category }}

{% load markdown_deux_tags %}

{{ post.content|truncatechars_html:50 }}

Read More

{% endfor %}

{% endblock %}归档页面

{% extends "base.html" %}

{% block content %}

{% if error %}

没找到相关文章

{% else %}

OK! 共找到 {{ post_list.count }} 篇日志。 继续努力。

{% endif %}

{% for post in post_list %}

{{ post.title }}

{{ post.datetime|date:"Y-m-d" }}

{% endfor %}

{% endblock %}我把归档和同分类文章用了同一个模板,通过if判断来展示不同的页面。标签页面

{% extends 'base.html' %}

{% block content %}

分类:{{ post_list.first.category }}下有{{ post_list.count }}篇日志。 继续努力。

{% for post in post_list %}

{{ post.title }}

Time:{{ post.datetime|date:"Y-m-d" }}

分类:{{ post.category }}

{% load markdown_deux_tags %}

{{ post.content|truncatechars_html:50 }}

Read More

{% endfor %}

{% endblock %}文章页面

{% extends 'base.html' %}

{% block content %}

{{ post.title }}

Time:{{ post.datetime|date:"Y-m-d" }}

分类:{{ post.category|title }}

{% load markdown_deux_tags %}

{{ post.content|markdown }}

{% endblock %}

markdown语法

安装markdown插件,

pip3installdjango-markdown-deux然后需要在settings.py中设置

INSTALLED_APPS= [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'article',

'markdown_deux'

]在模板中像我那样调用

{% load markdown_deux_tags %}

{{ post.content|markdown }}

后记

我们的django开发个人博客总算是结束了,前端模板写的不好,你们可以自己写一波好看的。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180626G009CI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券