关于Django建立博客的教程很多,本文参考慕课网的教学视频:Django入门与实践 创建了一个博客。
软件:Python 3.6 , Django 1.11.5
电脑:win7 64位
开发环境:Pycharm
创建具体步骤如下:
1、创建一个app应用
在本地创建一个名为blog的文件,在cmd命令中定位到该文件所在目录。
首先启动服务,此时可以得到一个本地地址:127.0.0.1:8000
python manage.py runserver
然后创建名为 myblog 的应用:
python manage.py startapp myblog
此时便会在blog目录下多一个名为“myblog”的包,也就是我们创建的app项目。
TIPS:要查看所有的命令,可以在cmd中直接输入 python manage.py 进行查看。
2、创建博客首页
博客首页用来展示博客的所有文章,以文章标题的形式展现出来,因此首先需要创建一个数据库用来存储所有的文章,然后创建一个html模板,将其在前端表现出来。
2.1 创建数据库
在myblog下的models.py中,创建名为Article的数据库,代码如下:
class Article(models.Model):
title = models.CharField(max_length=32, null=True)
content = models.TextField(null=True)
creat_time = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
def str(self):
return self.title
函数是为了将文章的标题打印在电脑屏幕上。
创建好后,需要再次进入cmd中,依次执行以下两条命令将数据库关联上:
python manage.py makemigrations
python manage.py migrate
2.2 在视图函数中创建函数
from . import models
def index(request):
articles = models.Article.objects.all()
return render(request, 'index.html', {'articles':articles})
需要将models导入进来,“.”的意思是从本包中导入
2.3 创建“index.html”模板
首先需要在myblog目录下创建一个名为“templates”的文件夹;
然后在该文件建中创建一个“index.html”文件:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>博客首页title>
head>
<body>
<h1>博客首页h1>
<h3><a href="#">写博客a>h3>
<ul>
{% for article in articles %}
<li>
<span><a href="#">{{ article.title }}a>span>
<span>发布时间:{{ article.creat_time }}span>
li>
{% endfor %}
ul>
<p>共有博客数目:{{ articles|length }}p>
body>
html>
{{ articles|length }},这段代码用了装饰器的知识,可以将统计articles列表中的元素数目,也就得到了文章的数目。
2.4 通过url将前后端连接到一起
有两个urls.py,一个在blog目录下;另一个需要在myblog目录下创建。
第一个urls.py,通过include指向到第二个:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^myblog/', include('myblog.urls', namespace='myblog')),
]
第二个urls.py,指向视图函数:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/', views.index),
]
如此,便得到了博客首页。
运行:python manage.py runserver
输入:127.0.0.1:8000/myblog/index/
便可得到博客首页,如下图所示:
3、创建博客具体内容
目标:当点开首页的博客文章标题时,可以进入文章页面中,显示文章具体内容。
创建方式同首页类似,首先建立一个视图函数,然后创建模板,在通过url将其关联起来。需要注意的是,这里通过article_id,索取到文章id,并传递给视图函数,然后视图函数将对应的文章从数据库中找到,在传给html模板,展示出来。
代码如下:
view.py
def article(request,article_id):
article = models.Article.objects.get(pk=article_id)
return render(request, 'article.html', {'article':article})
templates下新建一个article.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>博客文章title>
head>
<body>
<h2>{{ article.title }}h2>
<p>{{ article.content }}p>
<hr>
<a href="#">修改文章a>
body>
html>
myblog下的urls.py
urlpatterns = [
url(r'^index/', views.index),
url(r'^article/(?P[0-9]+)/$' , views.article, name='article'),
]
此时,需要将index.html中的文章标题链接加上:
<span><a href="{% url 'myblog:article' article.id %}">{{ article.title }}a>span>
点击首页的博客标题”我的第一篇博客“,可以进入如下页面:
4、创建新的博客
创建方法同上。注意点:写完博客后,通过post方法提交,此时需要在建立一个视图函数将数据写入数据库中。
views.py:edit函数为新建博客的函数,submit函数为点击提交按钮后运行的函数。
def edit(request):
return render(request, 'edit.html')
def submit(request):
title = request.POST.get('title')
content = request.POST.get('content')
models.Article.objects.create(title=title, content=content)
return HttpResponseRedirect('/myblog/index')
templates下新建一个edit.html:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑文章title>
head>
<body>
<form action="{% url 'myblog:submit' %}" method="post">
{% csrf_token %}
<lable>文章标题lable>
<input type="text" name="title">
<br>
<lable>文章内容lable>
<input type="text" name="content">
<br>
<input type="submit" value='提交'>
form>
body>
html>
注意:需要添加{% csrf_token %},目的是为了防止跨站访问xxxx之类的(不懂),反正不加这句话的话会出错。
myblog下的urls.py:
urlpatterns = [
url(r'^index/', views.index),
url(r'^article/(?P[0-9]+)/$' , views.article, name='article'),
url(r'^edit/', views.edit,name='edit'),
url(r'^submit/', views.submit,name='submit'),
]
在index.html中,将”写博客“的超链接加上:
<h3><a href="{% url 'myblog:edit' %}">写博客a>h3>
点击博客首页的”写博客“,写完后,点击提交,即可。
5、修改博客
在点击博客首页的标题后,进入博客正文页面,下面有个”修改博客“按钮。目的是为了对之前写的博客进行编辑,当点击时,进入的是与写博客一样的界面,但是文本框中应该存在之前博客的内容,当修改完点击提交后,应该覆盖原来的内容。
因此,点击修改博客,会导入该篇博客的内容,即存在参数的传递,通过article_id将该博客的id通过url传到后台,因此当修改博客是,传递article_id = article.id ,当新建博客时,传递article_id = 0.
因此,对之前的urls.py进行修改:
urlpatterns = [
url(r'^index/', views.index),
url(r'^article/(?P[0-9]+)/$' , views.article, name='article'),
url(r'^edit/(?P[0-9]+)/$' , views.edit,name='edit'),
url(r'^submit/', views.submit,name='submit'),
]
并修改index.html中的:
<h3><a href="{% url 'myblog:edit' 0 %}">写博客a>h3>
修改article.html中的:
<a href="{% url 'myblog:edit' article.id %}">修改文章a>
修改views.py中的edit函数:
def edit(request,article_id):
if str(article_id) == "0":
return render(request, 'edit.html')
article = models.Article.objects.get(pk=article_id)
return render(request, 'edit.html', {'article':article})
修改edit.html模板文件:
<form action="{% url 'myblog:submit' %}" method="post">
{% csrf_token %}
<input type="hidden" name="article_id" value="{{ article.id|default:'0' }}">
<lable>文章标题lable>
<input type="text" name="title" value="{{ article.title }}">
<br>
<lable>文章内容lable>
<input type="text" name="content" value="{{ article.content }}">
<br>
<input type="submit" value='提交'>
form>
点击提交后,通过 进行传参,将文章id传到视图函数中的submit函数中,函数修改如下:
def submit(request):
title = request.POST.get('title')
content = request.POST.get('content')
article_id = request.POST.get('article_id')
if str(article_id) == '0':
models.Article.objects.create(title=title, content=content)
return HttpResponseRedirect('/myblog/index')
article = models.Article.objects.get(pk=article_id)
article.title = title
article.content = content
article.save()
return render(request, 'article.html', {'article':article})
如此,最终完成博客的创建。
TIPS:有一点不完美的是,在修改完博客后,跳转到当前博客内容下,但是地址栏链接变了,这个问题回头再找下解决办法。
6、Admin查看后台数据
Django中很好的一个东西是Admin函数,可以查看后台数据:
Admin.py:
from django.contrib import admin
from .models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'content','creat_time')
list_filter = ('creat_time',)
admin.site.register(Article, ArticleAdmin)
并将setting.py中的语言改为汉语:
LANGUAGE_CODE = 'zh-Hans'
在cmd中创建管理员用户:
python manage.py createsuperuser
输入用户名、邮箱、密码、确认密码即可。
进入127.0.0.1:8000/admin
输入管理员账号,密码即可管理后台了。很方便,很直观。
最后,本文创建的博客并没有经过css优化,html文件也很垃圾,后期可以进行美化。