前言
在学习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开发个人博客总算是结束了,前端模板写的不好,你们可以自己写一波好看的。
领取专属 10元无门槛券
私享最新 技术干货