Python Django实现个人博客系统的搭建

Python Django实现个人博客系统的搭建攻略

简介

Python的Django框架在web开发中应用广泛,本文将介绍如何使用Django框架搭建个人博客系统。该博客系统除常见博客功能外,还包含用户身份验证,文章归档,评论系统等功能。

必要的工具及技能

在开始搭建博客系统前,需要准备好以下工具及技能:

  • Python3.x
  • Django
  • HTML,CSS,JavaScript等前端技能

配置Django环境

  • 安装Python3.x,这里以Python3.9为例(Windows平台):
    bash
    $ python3.9.exe -m venv myvenv #创建虚拟环境 myvenv
    $ cd myvenv/Scripts/ #进入虚拟环境
    $ activate # 激活虚拟环境
  • 通过pip安装Django
    bash
    (myvenv) $ pip install django

创建Django项目

  • 通过Django CLI创建新项目
    bash
    (myvenv) $ django-admin startproject myproject

创建博客应用

  • 通过Django CLI创建新应用
    bash
    (myvenv) $ cd myproject
    (myvenv) $ python manage.py startapp blog
  • 创建Django模型,设置数据库
    ```python
    # 在blog/models.py中定义文章和评论模型
    from django.db import models
    from django.utils import timezone

class Post(models.Model):
author = models.ForeignKey('auth.user', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
create_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)

  def publish(self):
      self.published_date = timezone.now()
      self.save()

  def __str__(self):
      return self.title

class Comment(models.Model):
post = models.ForeignKey('blog.Post', related_name='comments', on_delete=models.CASCADE)
author = models.CharField(max_length=200)
text = models.TextField()
create_date = models.DateTimeField(default=timezone.now)
approved_comment = models.BooleanField(default=False)

  def approve(self):
      self.approved_comment = True
      self.save()

  def __str__(self):
      return self.text

在已安装的数据库中创建数据表bash
(myvenv) $ python manage.py makemigrations blog
(myvenv) $ python manage.py migrate blog
```

创建视图,处理用户请求

  • 定义视图函数,使用模板返回HTML页面
    ```python
    # 在blog/views.py文件中定义处理请求的视图函数
    from django.shortcuts import render, get_object_or_404, redirect
    from django.utils import timezone
    from blog.forms import PostForm, CommentForm
    from blog.models import Post

def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
comments = post.comments.filter(approved_comment=True)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.save()
return redirect('blog.views.post_detail', pk=post.pk)
else:
form = CommentForm()
return render(request, 'blog/post_detail.html', {'post': post, 'comments': comments, 'form': form})

def post_new(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('blog.views.post_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})

def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == "POST":
form = PostForm(request.POST, instance=post)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('blog.views.post_detail', pk=post.pk)
else:
form = PostForm(instance=post)
return render(request, 'blog/post_edit.html', {'form': form, 'post': post})
在blog应用内创建`form.py`文件,定义文章和评论表单python
from django import forms
from blog.models import Post, Comment

class PostForm(forms.ModelForm):

  class Meta:
      model = Post
      fields = ('title', 'text',)

class CommentForm(forms.ModelForm):

  class Meta:
      model = Comment
      fields = ('author', 'text',)

在`myproject/myproject/settings.py`文件中添加`blog`应用,设置静态文件,模板路径等python
INSTALLED_APPS = [
'blog',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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页面

  • 创建博客系统的HTML页面
  • myproject/templates/blog目录下添加post_list.htmlpost_detail.htmlpost_edit.html文件
  • 可以使用Bootstrap等前端框架渲染博客页面
  • 代码示例
    ```html

{% extends 'blog/base.html' %}

{% block content %}

{% for post in posts %}

{{ post.published_date }}

{{ post.title }}

{{ post.text|linebreaksbr }}

{% endfor %}

{% endblock content %}

{% extends 'blog/base.html' %}

{% block content %}

{{ post.published_date }}

{{ post.title }}

{{ post.text|linebreaksbr }}


{% for comment in comments %}

{{ comment.create_date }}
Remove

{{ comment.author }}

{{ comment.text|linebreaksbr }}

{% empty %}

No comments here yet :(

{% endfor %}


{% csrf_token %}
{{ form.as_p }}

{% endblock content %}

{% extends 'blog/base.html' %}

{% block content %}

{% csrf_token %}
{{ form.as_p }}

{% endblock content %}
- 创建base.html作为页面的基本框架,作为其他模板继承html





{% block title %}{% endblock title %}

{% block content %}
{% endblock content %}





```

运行和测试博客系统

  • 启动Django服务器
    bash
    (myvenv) $ python manage.py runserver
  • 在浏览器中访问http://127.0.0.1:8000/查看博客系统

示例说明

示例1:添加用户身份验证

为了添加用户身份验证,我们需要在模型中定义用户,添加用户注册和登录的视图函数。

用户模型

# 基于Django内置的auth User模型扩展UserProfile模型
from django.contrib.auth.models import User
from django.db import models

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    avatar = models.ImageField(upload_to='avatar', blank=True)

    def __str__(self):
        return self.user.username

用户注册视图函数

from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from django.contrib.auth.forms import UserCreationForm

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            user.refresh_from_db()
            user.profile.avatar = request.FILES['avatar']
            user.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('blog.views.post_list')
    else:
        form = UserCreationForm()
    return render(request, 'registration/signup.html', {'form': form})

用户登录视图函数

from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('blog_v2:post_list')
    else:
        form = AuthenticationForm()
    return render(request, 'registration/login.html', {'form': form})

示例2:添加文章归档

在博客系统中添加文章归档需要在视图函数内根据发布时间进行聚类。

归档视图函数

from django.shortcuts import render
from django.db.models import Count
from blog.models import Post

def post_archive(request):
    return render(request, 'blog/post_archive.html')

def post_archive_year(request, year):
    posts = Post.objects.filter(published_date__year=year)
    post_count = posts.count()
    context = {
        'year': year,
        'posts': posts,
        'post_count': post_count,
    }
    return render(request, 'blog/post_archive_year.html', context)

def post_archive_month(request, year, month):
    posts = Post.objects.filter(published_date__year=year, published_date__month=month)
    post_count = posts.count()
    context = {
        'year': year,
        'month': month,
        'posts': posts,
        'post_count': post_count,
    }
    return render(request, 'blog/post_archive_month.html', context)

def post_archive_day(request, year, month, day):
    posts = Post.objects.filter(published_date__year=year, published_date__month=month, published_date__day=day)
    post_count = posts.count()
    context = {
        'year': year,
        'month': month,
        'day': day,
        'posts': posts,
        'post_count': post_count,
    }
    return render(request, 'blog/post_archive_day.html', context)

def post_archive_list(request):
    archive = Post.objects.annotate(year=ExtractYear('published_date'), month=ExtractMonth('published_date')).values('year', 'month').annotate(count=Count('id'))
    context = {'archive': archive}
    return render(request, 'blog/post_archive_list.html', context)

归档HTML模板

<!-- post_archive_list.html -->
{% extends 'blog/base.html' %}

{% block content %}
  <div class="content-section">
      <div class="container">
          <div class="row">
              <div class="col-lg-8">
                  <h1 class="mt-0">Archive</h1>
                  <ul>
                  {% for year in archive %}
                      <li><a href="{% url 'blog.views.post_archive_year' year=year.year %}">{{ year.year }} ({{ year.count }})</a>
                        <ul>
                        {% for month in year.month|slice:":" %}
                            <li><a href="{% url 'blog.views.post_archive_month' year=year.year month=month|date:"m" %}">{{ month|date:"F" }} ({{ month.posts.count }})</a>
                                <ul>
                                    {% for post in month.posts %}
                                    <li><a href="{% url 'blog.views.post_detail' pk=post.pk %}">{{ post.title }}</a></li>
                                    {% endfor %}
                                </ul>
                            </li>
                        {% endfor %}
                        </ul>
                      </li>
                  {% endfor %}
                  </ul>
              </div>
          </div>
      </div>
  </div>
{% endblock content %}

归档URL定义

from django.urls import path
from blog.views import post_archive_list, post_archive_year, post_archive_month, post_archive_day

urlpatterns = [
    path('archive/', post_archive_list, name='post_archive_list'),
    path('archive/<int:year>/', post_archive_year, name='post_archive_year'),
    path('archive/<int:year>/<int:month>/', post_archive_month, name='post_archive_month'),
    path('archive/<int:year>/<int:month>/<int:day>/', post_archive_day, name='post_archive_day'),
]

结语

通过本文的介绍,您可以完成一个基本的个人博客系统搭建。在博客系统中包含用户身份验证和文章

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Django实现个人博客系统的搭建 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Django ModelForm类生成表单

    1. 定义ModelForm类 #froms.py from django import forms from app01.modles import User class UserModelForm(forms.ModelForm): class Meta: model = User #关联的model类 fields = “__all__” #或(‘na…

    Django 2023年4月13日
    00
  • Django 中使用流响应处理视频的方法

    下面是关于“Django 中使用流响应处理视频的方法”的完整攻略: 什么是流响应 流响应,即将一个大文件分别分割成一小段文件进行逐步传输,比直接下载整个文件更加高效,能够提高客户端获取数据的速度,大大降低客户端内存的消耗,成功解决了直接下载大文件内存不足的问题。 在 Django 中应用流响应处理视频 在 Django 中,通过使用流文件读取对象FileWr…

    Django 2023年5月16日
    00
  • Django- filter和simpletag,inclusion_tag的用法

    filter的用法: #先引入template from django import template #声明register,名字只能是register register = template.Library() #带名字的装饰器,调用的时候用起的名字 如dsb @register.filter(name=’dsb’) def add_sb(value, …

    Django 2023年4月12日
    00
  • Django rest framework基本介绍与代码示例

    下面是针对“Django rest framework基本介绍与代码示例”的详细讲解: 1. Django rest framework基本介绍 Django rest framework是一个建立在Django框架上的Web API开发工具,它基于大量的RESTful原则来构建API。Django rest framework可以帮助我们快速构建高质量的W…

    Django 2023年5月16日
    00
  • python+django+selenium搭建简易自动化测试

    我来详细讲解Python + Django + Selenium 搭建简易自动化测试的完整攻略。本攻略包含以下几个部分:环境搭建、安装必要库、配置Django、使用Selenium编写自动化测试脚本。 环境搭建 在开始搭建之前,需要确保你的电脑上安装了Python环境。可以通过终端命令python –version来检查是否安装。如果尚未安装,请到Pyth…

    Django 2023年5月16日
    00
  • Django分页器的用法详解

    Django分页器的用法详解 在网站开发过程中,通常需要对一些数据进行分页展示,而Django提供了方便的分页器来满足开发者的需求。本文将详细介绍Django分页器的用法,并带有两个实例说明。 一、Django分页器基本用法 Django提供了Paginator类来实现分页器。我们首先需要在视图中导入Paginator类: from django.core.…

    Django 2023年5月16日
    00
  • Django模型中的admin后台管理无法显示字段

    在执行django后台管理时,登陆到http://127.0.0.1:8000/admin/,进入页面后没有对应的字段显示。请解决?   代码: models.py from django.db import models # Create your models here. #发布会表 from django.db import models class …

    2023年4月9日
    00
  • 手把手教你使用Django + Vue.js 快速构建项目

    我来为你讲解”手把手教你使用Django + Vue.js 快速构建项目”的完整攻略。该攻略包括两个示例说明。 简介 Django是一个Python Web框架,Vue.js是一个流行的前端框架。Django+Vue.js的组合可以快速构建一个全栈Web应用程序。攻略主要包括以下步骤: 创建Django项目 创建Vue.js项目 使用Django Rest …

    Django 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部