Django基本博客功能实现

本文详述了使用Python36和Django2.1搭建一个基础博客的过程,包括创建项目、分析需求、建立模型、配置admin、编写主页面、文章页面和编辑页面,以及完善URL。适合初学者了解Django框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍:Python36+Django2.1+PyCharm 编写一个具有最基本功能的博客。主要用于个人理清Django的框架和运作方式。

如果看到这篇文章的人想学习Django的话,建议先看看慕课网的视频教程:https://www.imooc.com/learn/790

这个视频比较容易入门,我也是看了这个视频之后,决定自己理一下创建博客的思路,才写下这篇文章。毕竟我之前没接触过Web框架一类的东西,对于HTTP的理解也不够好。

还有自强学堂的教程https://code.ziqiangxuetang.com/django/django-tutorial.html。Django目前已经更新到2.1,一些语法也发生了变化,自强学堂的教程有跟进,介绍了2.0版本的用法。

好了,下面直接理理框架、熟悉命令吧。

1.打开文件夹下命令提示符,创建项目:
django-admin startproject simblog
2.创建app:
cd simblog
django-admin startapp blog
3.修改设置,添加APP
用PyCharm打开项目,在settings.py的INSTALLED_APPS列表中添加'blog',

最好有逗号,避免下次添加时忘记。这一步本身也容易忘记。

4.分析需求

做一个简单的博客,至少需要3个页面:

1.主页面

显示所有文章的名称

可以新建文章

2.文章页面

显示文章的标题和内容

可以修改文章

3.编辑页面

一种是空白的编辑页面(新建文章时)

一种是带有原始文章的页面(编辑文章时)

5.建立模型

首先建立所需数据的模型,没有数据哪来显示之说~

在models.py中:

from django.db import models


class Article(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField(null=True)

    def __str__(self):
        return self.title

Django会严格要求空行和缩进。

在这里,数据库的一张表看作一个类,表中的字段就是类的属性。表中的数据就是类对应的对象。

在类中没有创建主键,Django**会自动创建名为id的主键**,该主键从1开始自增,使用比较方便。

类最下面两行函数的作用是,以title的名字显示对象的存在,而不是Object 1Object 2什么的,让人区分不清楚。

迁移数据库:(告诉系统模型修改过)

python manage.py makemigrations
python manage.py migrate
6.admin界面创建几条数据
1.在admin.py中注册模型:
from django.contrib import admin
from .models import Article


admin.site.register(Article)
2.注册一个admin:(此步之前必须迁移一次数据库)

打开manage.py所在位置的命令提示符,输入

python manage.py createsuperuser

以及管理员名字、邮箱和密码。

3.开启测试服务器:

python manage.py runserver

当然也可以自行改端口。

然后登录http://127.0.0.1:8000/admin/输入账号和密码。

就可以输入数据编辑文章了,admin直接后台管理操作数据的功能可以说非常强大了。

当然简单的创建数据也可以通过python manage.py shell之后,通过Article.objects.create()方法写文章。

4.将admin界面改成中文:

在settings.py中做如下修改:

LANGUAGE_CODE = 'zh-Hans'
7.编写博客主页面
1.创建index.html:

在APP下创建templates文件夹,并在文件夹下创建与APP同名的文件夹,再在下面创建index.html。(考虑到Django对模板文件的查找方式,为避免重名带来的混淆,需要多创建一个与APP重名的文件夹)

2.创建需要的函数:

打开views.py,创建index函数:

from django.shortcuts import render
from .models import Article


def index(request):
    articles = Article.objects.all()
    return render(request, 'blog/index.html', {'articles': articles})

由于主页面需要显示所有的文章名列表,所以需要通过views.py中的函数,将Models中的数据传递到前端的模板中。

3.编辑index.html:

注意for循环的应用以及article的引用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文章列表</title>
</head>
<body>
<h1><a href="">新文章</a></h1>
{% for article in articles %}
    <h2><a href="">{{ article.title }}</a></h2>
{% endfor %}
</body>
</html>
4.添加url:

为了使主urls.py中的函数逻辑更清晰,在主urls.py中引用APP中的urls.py,再在APP中的urls.py中引用函数。

在主urls.py中引用APP中的urls.py:

设置namespace有助于后面要用到的相对定位。namespace应该放到include里面。

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls', namespace='blog')),
]

在APP中的urls.py中引用函数:

先在APP中创建urls.py,然后编辑:

如果不添加app_name = 'blog',就会报错。

from django.urls import path
from blog.views import views
app_name = 'blog'


urlpatterns = [
    path('index/', views.index, name='index'),
]
5.查看主页面:

输入http://127.0.0.1:8000/blog/index/查看

主页面基本成形,后续需要进行超链接的设置。

8.编写博客文章页面
1.创建article_page.html:
2.编写article_page函数:

打开views.py:

注意需要将article_id一同传递。

def article_page(request, article_id):
    article = Article.objects.get(pk=article_id)
    return render(request, 'blog/article_page.html', {'article': article})
3.编辑article_page.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文章</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<h2>{{ article.content }}</h2>
<h3><a href="">修改文章</a></h3>
</body>
</html>
</html>
4.添加url:

打开blog下的views.py,添加:

re_path('^article/(?P<article_id>[1-9]*\d)$', views.article_page, name='article')

这里使用了正则表达式,引入分组article_id便于后续操作,[1-9]*\d匹配文章序号。

5.访问:

可以通过:http://127.0.0.1:8000/blog/article/1

访问文章

HTML中的超链接还待完善。

9.编写博客编辑页面
1.创建edit_page.html:
2.编写edit_page函数:

首先考虑,只是单纯的访问edit_page,而不是提交数据,这一响应应该返回怎样的页面。

如果是从index界面的新建文章访问,那么编辑页面中,文章标题和文章内容,都显示空白的字段。

如果是从article界面的修改文章访问,那么编辑页面中,文章标题和文章内容,显示的是原文章和标题的内容。

那么如何区分呢?

考虑到进入edit_page页面只有两种方式,从“新建文章”进入,从“修改文章”进入。那么只需要在从html文件的超链接访问edit_page界面时,传递一个article_id即可。

其中从新建文章进入时,article_id为0。从修改文章进入时,article_id为其它数字。由此便可以区分。

def edit_page(request, article_id):
    if article_id == '0':
        return render(request, 'blog/edit_page.html')
    article = Article.objects.get(pk=article_id)
    return render(request, 'blog/edit_page.html', {'article': article})
3.编辑edit_page.html:

article变量可能被传过来了,也可能没有被传过来。由于Django默认不存在的变量为空,所以直接使value等于article的属性值没有太大问题。

但是由于在后续的edit_action函数中,需要将article_id的值传输过去,并比较article_id的值是否为’0’。所以这里需要设置一个隐藏的input标签,并设置article_id的默认值为’0’。

注意default:与’0’之间不能有空格,否则会报错。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑文章</title>
</head>
<body>
<form action="", method="POST">
{% csrf_token %}
    <input type="hidden", name="article_id", value="{{ article.id | default:"0"}}"/>
    <label>
    <input type="text", name="title", value="{{ article.title }}"/>文章标题
    </label></br></br>
    <label>
    <input type="text", name="content", value="{{ article.content }}"/>文章内容
    </label></br></br>
    <input type="submit", value="保存修改"/>
</form>
</body>
</html>
4.编辑edit_action函数:

当提交表单时,就会产生一个action,需要对该部分进行处理。

首先获取在input中填写的信息,记得赋上默认值。

如果是新建文章得到的,article_id为0,创建新文章,返回主页面的文章列表。

如果是编辑文章得到的,article_id不为0,则修改并保存文章,返回修改后的文章内容。

def edit_action(request):
    article_id = request.POST.get('article_id', '0')
    title = request.POST.get('title', 'TITLE')
    content = request.POST.get('content', 'CONTENT')
    if article_id == '0':
        Article.objects.create(title=title, content=content)
        articles = Article.objects.all()
        return render(request, 'blog/index.html', {'articles': articles})
    article = Article.objects.get(pk=article_id)
    article.title = title
    article.content = content
    article.save()
    return render(request, 'blog/article_page.html', {'article': article})
5.添加edit_page和edit_action URL:
re_path('^edit/(?P<article_id>[1-9]*\d)$', views.edit_page, name='edit'),
path('edit/action/', views.edit_action, name='edit_action'),
6.测试:

测试http://127.0.0.1:8000/blog/edit/1

http://127.0.0.1:8000/blog/edit/0

页面的情况。

还剩余form标签中action部分的超链接没有写。

10.完善URL部分

假设我们从主页面进入博客。主页面一共有两个超链接,一个是新建文章,另外一个是点击标题查看文章。

1.新建文章

在index.html中进行以下修改,表示跳转到文章编辑页面,并对于article_id赋值为0。

<h1><a href="{% url 'blog:edit' 0 %}">新文章</a></h1>

2.查看文章

在index.html下进行以下修改,表示跳转到相应的文章内容页面。

注意是article.id,是对于特定文章取它的id值。

<h2><a href="{% url 'blog:article' article.id %}">{{ article.title }}</a></h2>

3.修改文章

在article_page.html下进行修改,表示跳转到对应文章的编辑页面。

<h3><a href="{% url 'blog:edit' article.id %}">修改文章</a></h3>

4.完善edit_action的功能

在edit_page.html进行修改,表示将提交结果响应给edit_action函数。

<form action="{% url 'blog:edit_action' %}", method="POST">

5.测试功能:

进入主页面:http://127.0.0.1:8000/blog/index/

测试功能是否能够实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值