Python 课程21-Django

前言

在当今互联网时代,Web开发已成为一项必备技能。而Python作为一门简洁、高效的编程语言,其Web框架Django以其强大的功能和快速开发的特点,受到了广大开发者的青睐。如果你想深入学习Django,构建自己的Web应用,那么本教程将是你的最佳起点。

本教程将以循序渐进的方式,带你从零开始,深入了解Django的各个核心组件,包括模型、视图、模板、URL路由等。通过实践,你将学会如何创建一个功能完整的博客应用。


目录

  1. 环境准备
    • 安装Django
  2. 创建Django项目
    • 初始化项目
    • 运行开发服务器
  3. 创建应用程序
    • 什么是Django应用
    • 创建博客应用
    • 注册应用
  4. 设计数据库模型(Models)
    • 定义博客文章模型
    • 迁移数据库
  5. Django管理后台
    • 创建超级用户
    • 注册模型到管理后台
    • 使用管理后台管理数据
  6. 编写视图(Views)
    • 什么是视图函数
    • 创建文章列表视图
    • 创建文章详情视图
  7. 配置URL路由
    • 项目级URL配置
    • 应用级URL配置
  8. 编写模板(Templates)
    • 设置模板目录
    • 创建文章列表模板
    • 创建文章详情模板
  9. 使用静态文件(Static Files)
    • 配置静态文件目录
    • 引入CSS样式美化页面
  10. 添加分页功能
    • 使用Paginator类
    • 在模板中添加分页控件
  11. 添加评论功能
    • 定义评论模型
    • 创建评论表单
    • 处理评论提交
  12. 用户认证与权限管理
    • 注册与登录功能
    • 权限控制
  13. 部署到生产环境
    • 使用Gunicorn和Nginx
    • 数据库迁移
    • 安全性设置
  14. 结论

一、环境准备

1. 安装Django

使用pip安装Django:

pip install django

 安装完成后,输入以下命令检查版本:

django-admin --version

二、创建Django项目

1. 初始化项目

使用django-admin命令创建一个新的Django项目,命名为mysite

django-admin startproject mysite
cd mysite

 项目目录结构如下:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

2. 运行开发服务器

启动Django自带的开发服务器:

python manage.py runserver

在浏览器中访问http://127.0.0.1:8000/,你应该能看到Django的欢迎页面,说明项目创建成功。


三、创建应用程序

1. 什么是Django应用

Django项目是由多个应用组成的,每个应用负责特定的功能。应用可以很容易地被复用。

2. 创建博客应用

使用以下命令创建名为blog的应用:

python manage.py startapp blog

 此时,项目目录中会多一个blog文件夹,结构如下:

blog/
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py

3. 注册应用

mysite/settings.py中,将blog应用添加到INSTALLED_APPS列表中:

INSTALLED_APPS = [
    # Django默认应用
    'django.contrib.admin',
    'django.contrib.auth',
    # ...

    # 我们的博客应用
    'blog.apps.BlogConfig',
]

四、设计数据库模型(Models)

1. 定义博客文章模型

blog/models.py中,定义Post模型,代表一篇博客文章:

from django.db import models
from django.utils import timezone

class Post(models.Model):
    title = models.CharField('标题', max_length=200)
    author = models.CharField('作者', max_length=100)
    content = models.TextField('内容')
    created_at = models.DateTimeField('创建时间', default=timezone.now)
    updated_at = models.DateTimeField('更新时间', auto_now=True)

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'

    def __str__(self):
        return self.title

2. 迁移数据库

生成迁移文件:
python manage.py makemigrations

执行迁移:

python manage.py migrate

此时,Django会在数据库中创建对应的表。


五、Django管理后台

1. 创建超级用户

为了管理数据,我们需要创建一个超级用户:

python manage.py createsuperuser

按照提示输入用户名、邮箱和密码。

2. 注册模型到管理后台

blog/admin.py中注册Post模型:

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'created_at')
    search_fields = ('title', 'content')

3. 使用管理后台管理数据

启动开发服务器,访问http://127.0.0.1:8000/admin/,使用刚创建的超级用户登录。你将看到Post模型,可以在这里添加、修改和删除文章。


六、编写视图(Views)

1. 什么是视图函数

视图函数负责处理HTTP请求,并返回HTTP响应。Django通过视图将模型和模板连接起来。

2. 创建文章列表视图

blog/views.py中,添加以下代码:

from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.all().order_by('-created_at')
    return render(request, 'blog/post_list.html', {'posts': posts})

3. 创建文章详情视图

def post_detail(request, pk):
    post = Post.objects.get(pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

七、配置URL路由

1. 项目级URL配置

mysite/urls.py中,包含blog应用的URL:

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

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

2. 应用级URL配置

blog目录下创建urls.py,添加以下代码:

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
]

 


八、编写模板(Templates)

1. 设置模板目录

mysite/settings.py中,设置模板目录:

import os

TEMPLATES = [
    {
        # ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        # ...
    },
]

2. 创建文章列表模板

在项目根目录下创建templates/blog/post_list.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>我的博客</title>
</head>
<body>
    <h1>博客文章列表</h1>
    {% for post in posts %}
        <div>
            <h2><a href="{% url 'blog:post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
            <p>作者:{{ post.author }} | 创建时间:{{ post.created_at }}</p>
            <p>{{ post.content|truncatechars:100 }}</p>
        </div>
        <hr>
    {% empty %}
        <p>暂无文章。</p>
    {% endfor %}
</body>
</html>

3. 创建文章详情模板

templates/blog/post_detail.html中:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>{{ post.title }}</title>
</head>
<body>
    <h1>{{ post.title }}</h1>
    <p>作者:{{ post.author }} | 创建时间:{{ post.created_at }}</p>
    <div>
        {{ post.content }}
    </div>
    <a href="{% url 'blog:post_list' %}">返回列表</a>
</body>
</html>

九、使用静态文件(Static Files)

1. 配置静态文件目录

mysite/settings.py中,添加:

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

2. 引入CSS样式美化页面

在项目根目录下创建static/css/style.css,添加一些基本样式:

body {
    font-family: Arial, sans-serif;
    margin: 20px;
}

h1, h2 {
    color: #333;
}

a {
    text-decoration: none;
    color: #1a0dab;
}

 在模板中引入CSS文件:

<!-- 在<head>中添加 -->
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">

十、添加分页功能

1. 使用Paginator类

views.py中,修改post_list视图,添加分页功能:

from django.core.paginator import Paginator

def post_list(request):
    post_list = Post.objects.all().order_by('-created_at')
    paginator = Paginator(post_list, 5)  # 每页显示5篇文章

    page_number = request.GET.get('page')
    posts = paginator.get_page(page_number)
    return render(request, 'blog/post_list.html', {'posts': posts})

2. 在模板中添加分页控件

<!-- 在post_list.html的底部添加 -->
<div class="pagination">
    <span class="step-links">
        {% if posts.has_previous %}
            <a href="?page=1">首页</a>
            <a href="?page={{ posts.previous_page_number }}">上一页</a>
        {% endif %}

        <span class="current">
            第 {{ posts.number }} 页,共 {{ posts.paginator.num_pages }} 页
        </span>

        {% if posts.has_next %}
            <a href="?page={{ posts.next_page_number }}">下一页</a>
            <a href="?page={{ posts.paginator.num_pages }}">尾页</a>
        {% endif %}
    </span>
</div>

十一、添加评论功能

1. 定义评论模型

blog/models.py中,添加Comment模型:

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    name = models.CharField('姓名', max_length=80)
    email = models.EmailField('邮箱')
    body = models.TextField('评论内容')
    created_at = models.DateTimeField('评论时间', default=timezone.now)

    class Meta:
        verbose_name = '评论'
        verbose_name_plural = '评论'

    def __str__(self):
        return f'评论 {self.body} 由 {self.name}'

 迁移数据库:

python manage.py makemigrations
python manage.py migrate

2. 创建评论表单

blog/forms.py中:

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'body')

3. 处理评论提交

views.py中的post_detail视图,处理评论表单:

from .forms import CommentForm

def post_detail(request, pk):
    post = Post.objects.get(pk=pk)
    comments = post.comments.all()
    new_comment = None

    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            # 创建评论对象,但不保存到数据库
            new_comment = comment_form.save(commit=False)
            # 关联到当前的文章
            new_comment.post = post
            # 保存评论
            new_comment.save()
    else:
        comment_form = CommentForm()

    return render(request, 'blog/post_detail.html', {
        'post': post,
        'comments': comments,
        'new_comment': new_comment,
        'comment_form': comment_form
    })

4. 更新文章详情模板

post_detail.html中,添加评论显示和提交表单:

<h2>评论</h2>
{% for comment in comments %}
    <div>
        <p><strong>{{ comment.name }}</strong> 于 {{ comment.created_at }} 发表评论:</p>
        <p>{{ comment.body }}</p>
    </div>
{% empty %}
    <p>还没有评论,快来抢沙发!</p>
{% endfor %}

<h2>添加评论</h2>
{% if new_comment %}
    <p>你的评论已成功添加!</p>
{% else %}
    <form method="post">
        {% csrf_token %}
        {{ comment_form.as_p }}
        <button type="submit">提交评论</button>
    </form>
{% endif %}

十二、用户认证与权限管理

1. 注册与登录功能

创建注册表单

blog/forms.py中,添加注册表单:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class RegisterForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')
编写注册视图

blog/views.py中:

from django.contrib.auth import login
from .forms import RegisterForm

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('blog:post_list')
    else:
        form = RegisterForm()
    return render(request, 'registration/register.html', {'form': form})
配置URL

blog/urls.py中:

from django.contrib.auth import views as auth_views

urlpatterns += [
    path('register/', views.register, name='register'),
    path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
创建模板

创建templates/registration/register.htmltemplates/registration/login.html,编写相应的表单。

2. 权限控制

在需要限制访问的视图上添加装饰器,例如:

from django.contrib.auth.decorators import login_required

@login_required
def post_create(request):
    # 仅登录用户可以访问
    pass

十三、部署到生产环境

1. 使用Gunicorn和Nginx

在生产环境中,不建议使用Django自带的开发服务器。可以使用Gunicorn作为WSGI服务器,Nginx作为反向代理。

安装Gunicorn:
pip install gunicorn
启动Gunicorn:
gunicorn mysite.wsgi:application --bind 0.0.0.0:8000

2. 数据库迁移

在生产环境中,建议使用更强大的数据库,如PostgreSQL或MySQL。

安装数据库驱动:
pip install psycopg2-binary  # PostgreSQL
pip install mysqlclient      # MySQL
修改settings.py中的数据库配置。

3. 安全性设置

关闭调试模式:
DEBUG = False

设置允许的主机:

ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']

十四、结论

通过本教程,我们从零开始,深入探索了Django的核心功能,成功地构建了一个功能完善的博客应用。在这个过程中,你不仅了解了Django的基本架构和工作原理,还掌握了如何实际运用Django的模型、视图、模板和URL配置等核心组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云中红队系列 | 使用 AWS API 配置Fireprox进行 IP轮换

在渗透测试评估期间&#xff0c;某些活动需要一定程度的自动化&#xff0c;例如从 LinkedIn 等网站抓取网页以收集可用于社会工程活动、密码喷洒登录门户或测试时盲注的有效员工姓名列表网络应用程序。但是&#xff0c;从单个源 IP 地址执行这些活动可能会导致在测试期间被拦截…

深度学习—神经网络基本概念

一&#xff0c;神经元 1.生物神经元与人工神经元 1.1神经元是人脑的基本结构和功能单位之一。人脑中有数1000亿个神经元&#xff0c;其功能是接受&#xff08;树突&#xff09;&#xff0c;整合&#xff08;细胞体&#xff09;&#xff0c;传导&#xff08;轴突&#xff09;和…

电脑usb接口封禁如何实现?5种禁用USB接口的方法分享!(第一种你GET了吗?)

“防患于未然&#xff0c;安全始于细节。”在信息技术飞速发展的今天&#xff0c;企业的信息安全问题日益凸显。 USB接口作为数据传输的重要通道&#xff0c;在带来便利的同时&#xff0c;也成为了数据泄露和安全风险的高发地。 因此&#xff0c;对电脑USB接口进行封闭管理&a…

【OceanBase 诊断调优】—— GC问题根因分析

GC 流程涉及到 RS 的状态切换和 LS 的资源安全回收&#xff0c;流程上较长。且 GC 线程每个租户仅有一个&#xff0c;某个日志流 GC Hang 死时会卡住所有其余日志流的 GC&#xff0c;进而造成更大的影响。 本文档会帮助大家快速定位到 GC 故障的模块&#xff0c;直达问题核心。…

Redis篇(环境搭建)

目录 一、安装包 1. Windows版下载地址 2. Linux版下载地址 二、安装Redis 1. 在Linux中安装Redis 2. 在Windows中安装Redis 3. 细节问题 三、Redis服务启动 1. 默认启动 2. 指定配置启动 3. 开机自启 四、Redis服务停止 1. Linux系统中启动和停止Redis 2. Window…

SLF4J报错log4j又报错

项目场景&#xff1a; 搭建一个spirngboot项目&#xff0c;启动运行时&#xff0c;SLF4J报错 解决后 ~ log4j又报错了。 问题描述 首先是SLF4J报错了&#xff0c;解决完SL4J报错问题后&#xff0c;再次启动项目&#xff0c;log4j又报错了 。。。 报错信息&#xff1a; SLF4J…

Go语言匿名字段使用与注意事项

1. 定义 Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段&#xff0c;称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式&#xff0c;所以也可以称作嵌套字段。 这种方式可以实现组合复用&#xff0c;即通过匿名字段&#xff0c;结构体…

说说海外云手机的自动化功能

在全球社交媒体营销中&#xff0c;通过自动化功能&#xff0c;企业不再需要耗费大量时间和精力手动监控和操作每台设备。这意味着&#xff0c;企业可以显著提升效率、节省成本&#xff0c;同时减少对人力资源的依赖。那么&#xff0c;海外云手机的自动化功能具体能带来哪些优势…

使用ucharts写的小程序页面柱状图上方没有数字

使用uCharts官网 - 秋云uCharts跨平台图表库写的柱状图如何让柱子上放没有数据 更改前 更改后 使用uCharts官网 - 秋云uCharts跨平台图表库 写的小程序图表&#xff0c;无论是柱状图还是折线图添加一个 dataLabel: false, // 不显示数据 九可以实现不显示数据 const opts …

IDEA Dependency Analyzer 分析 maven 项目包的依赖

一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范&#xff08;Java Bean Validation&#xff0c;简称 JSR 380&#xff09;&#xff0c;它并没有具体的实现&#xff0c;它的常用实现&#xff0c;是hibernate-validator。…

数据结构 - 数组

今天我们将开始第一个数据类型-数组的学习。 经常会看到这样的问题&#xff0c;怎么学习数据结构&#xff0c;我的答案是搞清楚具体数据结构对应的抽象数据类型ADT&#xff0c;抛开语言层面自带的数据类型&#xff0c;然后自己从头 实现一遍。 其实数据结构没多复杂&#xff…

基于SSM+小程序的医院核酸检测服务管理系统(医院2)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的医院核酸检测服务管理系统实现了管理员、用户管理、普通管理员、医护人员。 1、管理员实现了首页、用户管理、医护人员管理、普通管理员、通知公告管理、疫苗接种管理、核…

华为GaussDB数据库(单机版)在ARM环境下的安装指南

一、软件版本 机器配置&#xff1a;8核16G&#xff0c;CPU: Huawei Kunpeng 920 2.9GHz操作系统&#xff1a;EulerOS 2.8 64bit with ARM数据库版本&#xff1a;GaussDB Kernel 505.1.0 build 44f4fa53 二、部署流程 2.1 新建用户 ① 以omm用户为例&#xff0c;添加一个omm用…

11. Map和Set

一、二叉搜索树 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根…

IvorySQL 3.4 来了

9 月 26 日&#xff0c;IvorySQL 3.4 发版。本文将带大家快速了解新版本特性。 IvorySQL 3.4 发版说明 IvorySQL 3.4 基于 PostgreSQL 16.4&#xff0c;修复了多个问题&#xff0c;并增强多项功能。 PostgreSQL 16.4 的变更 在未经授权时防止 pg_dump 执行&#xff0c;并引入一…

Qt-QTableWidget多元素控件(37)

目录 描述 QTableWidget 方法 QTableWidgetItem 信号 QTableWidgetItem 方法 使用 图形化界面操作 代码操作 描述 这是一个表格控件&#xff0c;表格中的每一个单元格&#xff0c;都是一个 QTableWidgetItem 对象 QTableWidget 方法 item(int row,int column)根据⾏数…

Snap AR眼镜Spectacles的技术揭秘:通往真正AR体验的道路

Snap公司自2010年成立以来&#xff0c;一直致力于探索增强现实&#xff08;AR&#xff09;技术的边界。经过多年的研发与迭代&#xff0c;Snap终于在最新一代Spectacles中实现了重大突破&#xff0c;为用户带来了前所未有的沉浸式AR体验。本文将深入探讨Spectacles的发展历程、…

【docker】debian中配置docker(2024年9月)

首先Follow了一下菜鸟教程&#xff0c;然后遇到了curl的问题。 curl存在的问题 参见这篇文章。其中用到了vim进行编辑&#xff0c;笔者的环境是windows10putty&#xff0c;vim的粘贴操作参考这篇文章。 修改之后的curl没有问题了&#xff0c;成功把脚本下载下来了。 但是在…

即插即用篇 | DenseNet卷土重来! YOLOv8 引入全新密集连接卷积网络 | ECCV 2024

本改进已同步到YOLO-Magic框架! 本文重新审视了密集连接卷积网络(DenseNets),并揭示了其在主流的ResNet风格架构中被低估的有效性。我们认为,由于未触及的训练方法和传统设计元素没有完全展现其能力,DenseNets的潜力被忽视了。我们的初步研究表明,通过连接实现的密集连接…

工作安排 - 华为OD统一考试(E卷)

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定…