使用 Django 构建博客 CMS(内容管理系统)
Django 是一个基于Python的 Web 应用程序框架,有助于构建各种 Web 应用程序。 Django 还包括一个可扩展的 Django-Admin 界面、默认 SQLIte3 数据库,它也可扩展到 PostgreSQL、MySQL 数据库和少数其他组件来构建高效的 Web 应用程序。
安装和设置 Django
为我们的博客创建一个目录,安装并激活虚拟环境。然后使用以下命令安装 Django
# creating directory for our project
mkdir gfgblog && cd gfgblog
# installing virtual environment
pip install virtualenv
python3 -m venv env
# activating virtual environment
source env/bin/activate
# installing django
pip install django
现在我们已经安装了 Django,我们现在将创建一个 Django 项目,该项目将设置一个基本的 Django 应用程序
django-admin startproject gfgblog
cd gfgblog
在我们的 gfgblog Django 应用程序中,我们将拥有这些文件
- __init__.py – 空文件
- urls.py – 用于路由我们的 Django 项目
- settings.py – 包含我们 Django 项目的所有设置
- asgi.py , wsgi – 在部署我们的应用程序时很有帮助
我们在 Django web 应用程序目录中。现在我们将为我们的数据库进行一些迁移,这将是 SQLite3,它将设置一些默认表以在我们的数据库中运行我们的应用程序。然后我们将为我们的应用程序创建一个超级用户。
# migrating tables
python3 manage.py makemigrations
python3 manage.py migrate
# create and enter the details for superuser
python3 manage.py createsuperuser
现在运行 Django 开发服务器并在本地主机中打开端口 8000
# running python development server
python3 manage.py runserver
现在停止服务器并进入 gfgblog Django 应用程序目录中的 gfgblog 目录,并使用您的代码编辑器打开 urls.py 文件。您可以从下图中查看我们的 gfgblog 目录树
在 Django 中创建一个博客应用程序 –
现在我们将为它创建我们实际的博客应用程序和数据库。转到 gfgblog 项目目录。你可以看到我们的 SQLite3 数据库,gfgblog Django 应用程序。现在在这个目录中创建一个名为 blog 的新应用程序。下面的命令将为我们创建一个新的应用程序。
# creating an app named blog
python3 manage.py startapp blog
新的 app 目录有 5 个默认文件
- __init__.py – 一个空文件
- admin.py – 用于管理管理界面
- apps.py – 用于管理应用程序配置
- models.py – 用于管理应用程序的数据库模型
- tests.py – 用于测试应用程序
- views.py – 用于管理应用程序的行为和逻辑
由于我们现在已经创建了应用程序,我们必须告诉 django 应用程序我们的项目中有一个新应用程序。为此,请转到 gfgblog 目录中的 settings.py 并打开 settings.py 文件。转到设置文件的已安装应用程序部分,添加我们在示例中创建的应用程序的名称,即博客
Python3
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
Python3
# importing django models and users
from django.db import models
from django.contrib.auth.models import User
STATUS = (
(0,"Draft"),
(1,"Publish"),
(2, "Delete")
)
# creating an django model class
class posts(models.Model):
# title field using charfield constraint with unique constraint
title = models.CharField(max_length=200, unique=True)
# slug field auto populated using title with unique constraint
slug = models.SlugField(max_length=200, unique=True)
# author field populated using users database
author = models.ForeignKey(User, on_delete= models.CASCADE)
# and date time fields automatically populated using system time
updated_on = models.DateTimeField(auto_now= True)
created_on = models.DateTimeField()
# content field to store our post
content = models.TextField()
# meta description for SEO benifits
metades = models.CharField(max_length=300, default="new post")
# status of post
status = models.IntegerField(choices=STATUS, default=0)
# meta for the class
class Meta:
ordering = ['-created_on']
# used while managing models from terminal
def __str__(self):
return self.title
Python3
TEMPLATES_DIR = os.path.join(BASE_DIR,'templates')
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATES_DIR],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
HTML
{% block metatags %}{% endblock %}
HTML
{% extends "base.html" %}
{% block metatags %}
Home | GeeksForGeeks
{% endblock %}
{% block content %}
Welcome to GeeksForGeeks
{% for post in posts_list %}
{{ post.title }}
{{ post.author.first_name }} {{ post.author.last_name }} | {{ post.created_on}}
{{post.metades }}
Read More →AMP page
{% endfor %}
{% if is_paginated %}
{% endif %}
{%endblock%}
HTML
{% extends 'base.html' %}
{% block metatags %}
{{ object.title }}
{% endblock %}
{% block content %}
{% block title %} {{ object.title }} {% endblock title %}
{{ object.author.first_name }} {{ object.author.last_name }} |{{ object.created_on }}
{{ object.content | safe }}
{% endblock content %}
Python3
# importing models and libraries
from django.shortcuts import render
from .models import posts
from django.views import generic
from django.views.decorators.http import require_GET
from django.http import HttpResponse
# class based views for posts
class postslist(generic.ListView):
queryset = posts.objects.filter(status=1).order_by('-created_on')
template_name = 'home.html'
paginate_by = 4
# class based view for each post
class postdetail(generic.DetailView):
model = posts
template_name = "post.html"
Python3
# importing django routing libraries
from . import views
from django.urls import path, include
from .views import *
from .feeds import blogFeed
urlpatterns = [
# home page
path('', views.postslist.as_view(), name='posts'),
# route for posts
path('/', views.postdetail.as_view(), name='post_detail'),
]
Python3
from django.contrib import admin
from django.urls import path, include, re_path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# urls handling admin route
path('admin/', admin.site.urls),
# urls handling blog routes
path('', include('blog.urls')),
]
为博客 CMS 创建模型 –
现在我们将为应用程序创建 Django 模型。您可以从本教程中了解有关 Django 模型的更多信息 – Django 模型
要创建 Django 模型,请在编辑器中打开并添加以下代码
蟒蛇3
# importing django models and users
from django.db import models
from django.contrib.auth.models import User
STATUS = (
(0,"Draft"),
(1,"Publish"),
(2, "Delete")
)
# creating an django model class
class posts(models.Model):
# title field using charfield constraint with unique constraint
title = models.CharField(max_length=200, unique=True)
# slug field auto populated using title with unique constraint
slug = models.SlugField(max_length=200, unique=True)
# author field populated using users database
author = models.ForeignKey(User, on_delete= models.CASCADE)
# and date time fields automatically populated using system time
updated_on = models.DateTimeField(auto_now= True)
created_on = models.DateTimeField()
# content field to store our post
content = models.TextField()
# meta description for SEO benifits
metades = models.CharField(max_length=300, default="new post")
# status of post
status = models.IntegerField(choices=STATUS, default=0)
# meta for the class
class Meta:
ordering = ['-created_on']
# used while managing models from terminal
def __str__(self):
return self.title
保存文件并进行迁移,以便使用以下命令在我们的数据库中创建字段
# creates migrations for the blog app
python3 manage.py makemigrations blog
# migrates the blog app
python3 manage.py migrate blog
到目前为止,我们擅长创建模型并设置我们的数据库来存储我们的帖子,但我们应该将它们呈现给用户。幸运的是,Django 带有自己的模板语言,我们可以使用它构建动态 HTML 页面来为我们的用户提供服务。我们还可以使用 CSS 和 JavaScript 添加样式。您可以在本教程中了解有关 Django 模板的更多信息 – Django 模板
为博客 CMS 创建模板 –
要创建模板,首先在博客应用程序中创建一个模板目录(您也可以在博客应用程序之外创建它,但这样管理起来会很容易)。为了以简单的方式为项目中的每个应用程序管理模板,我们必须对设置进行一些更改。转到项目设置文件并将模板设置替换为下面的代码
蟒蛇3
TEMPLATES_DIR = os.path.join(BASE_DIR,'templates')
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATES_DIR],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
现在我们将为我们的博客创建模板。由于 Django 可以动态构建页面,我们将根据它构建我们的模板。现在我们将创建一个基本模板,作为我们博客中所有页面的基础。
HTML
{% block metatags %}{% endblock %}
这将是我们的基本模板,您可以像 {% block name %}{% endblock %} 这样的块将被分配给他们的内容替换,现在我们将创建一个主页模板,它将成为我们博客的主页有最新的帖子。
HTML
{% extends "base.html" %}
{% block metatags %}
Home | GeeksForGeeks
{% endblock %}
{% block content %}
Welcome to GeeksForGeeks
{% for post in posts_list %}
{{ post.title }}
{{ post.author.first_name }} {{ post.author.last_name }} | {{ post.created_on}}
{{post.metades }}
Read More →AMP page
{% endfor %}
{% if is_paginated %}
{% endif %}
{%endblock%}
我们已经创建了带有分页的主页。帖子将使用 for 循环显示。现在我们将添加最后一个模板来单独显示帖子。
HTML
{% extends 'base.html' %}
{% block metatags %}
{{ object.title }}
{% endblock %}
{% block content %}
{% block title %} {{ object.title }} {% endblock title %}
{{ object.author.first_name }} {{ object.author.last_name }} |{{ object.created_on }}
{{ object.content | safe }}
{% endblock content %}
主页和帖子页面都将通过扩展基本模板并用存储在我们数据库中的数据替换块来构建。两者都有一个 Facebook 开放图,以便更好地共享和社交网络,并且帖子页面还有一个结构化的架构,以提供更好的 SEO。我们将构建 AMP 模板传入教程。
为博客 CMS 创建视图 –
现在打开博客目录中的 views.py 文件。此文件具有运行博客应用程序的逻辑。我们将为博客应用程序使用基于类的视图。基于类的通用视图是一组高级的内置视图,用于实现选择性视图策略,例如创建、检索、更新、删除。
蟒蛇3
# importing models and libraries
from django.shortcuts import render
from .models import posts
from django.views import generic
from django.views.decorators.http import require_GET
from django.http import HttpResponse
# class based views for posts
class postslist(generic.ListView):
queryset = posts.objects.filter(status=1).order_by('-created_on')
template_name = 'home.html'
paginate_by = 4
# class based view for each post
class postdetail(generic.DetailView):
model = posts
template_name = "post.html"
为博客 CMS 创建路由 –
对于路由我们的博客应用程序,只需进入博客应用程序目录并创建一个文件urls.py来路由我们的应用程序。看下面的代码
蟒蛇3
# importing django routing libraries
from . import views
from django.urls import path, include
from .views import *
from .feeds import blogFeed
urlpatterns = [
# home page
path('', views.postslist.as_view(), name='posts'),
# route for posts
path('/', views.postdetail.as_view(), name='post_detail'),
]
转到 gfgblog 目录中的 urls.py 文件并路由我们的博客应用程序。请参阅下面的代码以供参考
蟒蛇3
from django.contrib import admin
from django.urls import path, include, re_path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# urls handling admin route
path('admin/', admin.site.urls),
# urls handling blog routes
path('', include('blog.urls')),
]
完成,让我们现在使用
Python manage.py runserver