Python 课程21-Django

news2024/11/15 16:32:45

前言

在当今互联网时代,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.coloradmin.cn/o/2167889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

呼吸自救防护器的使用方式

呼吸自救防护器是一种用于在紧急情况下提供呼吸保护的设备&#xff0c;通常用于矿井、化工厂、火灾等环境。当出现缺氧、有毒有害气体泄漏或烟雾等紧急情况时&#xff0c;呼吸自救防护器可以提供氧气或过滤空气&#xff0c;帮助使用者在短时间内安全呼吸&#xff0c;逃离危险区…

十大常用加密软件排行榜|2024年好用的加密软件推荐,企业必备!

在信息安全日益受到重视的当今&#xff0c;选择合适的加密软件对于企业保护敏感数据至关重要。以下是2024年十大常用加密软件排行榜&#xff0c;助您提升数据安全性。 Ping32 Ping32是一款功能强大的加密软件&#xff0c;支持多种文件格式加密&#xff0c;用户界面友好&#xf…

【机器学习】 Flux.jl 求解 XOR 分类问题的神经网络模型

Flux.jl 搭建神经网络基本流程 #mermaid-svg-JuKPmnLqTqDhEhKf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JuKPmnLqTqDhEhKf .error-icon{fill:#552222;}#mermaid-svg-JuKPmnLqTqDhEhKf .error-text{fill:#5522…

【前端】35道JavaScript进阶问题

来源&#xff1a; javascript-questions/zh-CN/README-zh_CN.md at master lydiahallie/javascript-questions GitHub 记录一些有趣的题。 1 输出是&#xff1f; const shape {radius: 10,diameter() {return this.radius * 2},perimeter: () > 2 * Math.PI * this.rad…

[单master节点k8s部署]26.Istio流量管理(二)

bookinfo微服务 这个bookinfo微服务由四个微服务构成&#xff1a; 1&#xff09;productpage 这个微服务会调用 details 和 reviews 两个微服务&#xff0c;用来生成页面&#xff1b; 2&#xff09;details 这个微服务中包含了书籍的信息&#xff1b; 3&#xff09;reviews …

Scikit-LearnTensorFlow机器学习实用指南(三):一个完整的机器学习项目【下】

机器学习实用指南(三)&#xff1a;一个完整的机器学习项目【下】 作者&#xff1a;LeonG 本文参考自&#xff1a;《Hands-On Machine Learning with Scikit-Learn & TensorFlow 机器学习实用指南》&#xff0c;感谢中文AI社区ApacheCN提供翻译。 本文全部代码和数据集保存在…

TypeError: load() missing 1 required positional argument: ‘Loader‘

标题TypeError: load() missing 1 required positional argument: ‘Loader’ 源码&#xff1a; 处理后&#xff1a; 顺利通过&#xff0c;由于yaml版本导致的问题

Alertmanager 路由匹配

Alertmanager主要负责对Prometheus产生的告警进行统一处理&#xff0c;因此在Alertmanager配置中一般会包含以下几个主要部分&#xff1a; 全局配置&#xff08;global&#xff09;&#xff1a;用于定义一些全局的公共参数&#xff0c;如全局的SMTP配置&#xff0c;Slack配置等…

day-61 外观数列

思路 每次对字符串进行遍历即可&#xff0c;用一个Integer统计相邻的相同字符个数&#xff0c;如果当前字符与后面邻接的字符相同&#xff0c;num;如果不同&#xff0c;则将""nums.charAt(j)拼接到字符串中 解题过程 当n1时&#xff0c;可以直接返回&#xff0c;不为…

【机器学习导引】ch3-线性模型

线性回归 梯度 在数学中&#xff0c;对于函数 f ( x 1 , … , x m ) f(x_1, \ldots, x_m) f(x1​,…,xm​) 在点 a ( a 1 , … , a m ) a (a_1, \ldots, a_m) a(a1​,…,am​) 处的梯度被定义为&#xff1a; ∇ f ( a ) ( ∂ f ∂ x 1 ( a ) , … , ∂ f ∂ x m ( a ) )…

排序题目:对角线遍历 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;对角线遍历 II 出处&#xff1a;1424. 对角线遍历 II 难度 6 级 题目描述 要求 给定一个二维整数数组 nums \texttt{nums} nums&#xff0c;将 …

vue3.0 + element plus 全局自定义指令:select滚动分页

需求&#xff1a;项目里面下拉框数据较多 &#xff0c;一次性请求数据&#xff0c;体验差&#xff0c;效果就是滚动进行分页。 看到这个需求的时候&#xff0c;我第一反应就是封装成自定义指令&#xff0c;这样回头用的时候&#xff0c;直接调用就可以了。 第一步 第二步&…

eHR软件的价格一般是多少?

在人力资源数字化转型的大潮中&#xff0c;越来越多的企业开始关注eHR&#xff08;电子人力资源管理&#xff09;软件的采购问题。eHR软件价格并不是一个简单的数字&#xff0c;而是受多种因素影响&#xff0c;具有较大波动性。那么&#xff0c;eHR软件的价格一般是多少呢&…

侧边菜单的展开和折叠

通过按钮控制侧边栏的展开和折叠通过窗口宽度的变化控制侧边栏的展开和折叠&#xff08;小于768px,自动折叠&#xff09; 通过按钮控制展开 通过按钮控制折叠 切换到手机模式自动折叠 环境准备&#xff1a;Vue3Element-UI Plus <script setup> import {onMounted, r…

基于SpringBoot + Vue的Gucci进销存系统

文章目录 前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S 四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论 五、项目代码参考六、数据库代码参考七、项目论文示例结语 前言 &#x1f49b;博主介绍&a…

001. OBS (obs-studio)

1. 下载 https://obsproject.com/download windows c 插件下载 https://obsproject.com/visual-studio-2022-runtimes 2. 操作步骤 https://renwen.shnu.edu.cn/_s40/9a/2c/c28309a760364/page.psp https://zhuanlan.zhihu.com/p/597231652

【Java 问题】基础——IO

接上文 IO 42.Java 中 IO 流分为几种?Java IO体系中的装饰器模式抽象组件&#xff08;Component&#xff09;具体组件&#xff08;Concrete Component&#xff09;抽象装饰器&#xff08;Decorator&#xff09;具体装饰器&#xff08;Concrete Decorator&#xff09;使用装饰器…

喜讯 | 宝兰德「应用服务器软件 V9.5」荣获“2024年度优秀软件产品”殊荣

近日&#xff0c;中国软件行业协会公布了“2024年度推广优秀软件产品”名单。经过专家委员会的评议及最终审核&#xff0c;宝兰德凭借领先的技术能力和丰富的经验积累&#xff0c;中间件核心产品「应用服务器软件 V9.5」获评“2024年度优秀软件产品”。 本次评选活动由中国软件…

基于SpringBoot的在线考试系统设计与实现

1.1 研究背景 21世纪&#xff0c;我国早在上世纪就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统&#xff0c;由从今传统的管理模式向互联网发展&#xff0c;如今开发自己的系统是理所当然的。那么开发在线考试系统意…

vscode【实用插件】Project Manager 项目管理

安装 在 vscode 插件市场的搜索 Project Manager点 安装 安装成功后&#xff0c;vscode 左侧栏会出现 使用 将项目添加到项目列表中 用 vscode 打开项目&#xff0c;点保存即可 将项目移出项目列表 切换项目 单击项目列表中的项目&#xff0c;即可切换到目标项目 新窗口打开…