Django框架的全面指南:从入门到高级

Django框架的全面指南:从入门到高级

目录

  1. 引言
  2. Django简介
  3. 安装与配置
  4. 创建第一个Django项目
  5. Django的MVT架构
  6. 模型(Model)
  7. 视图(View)
  8. 模板(Template)
  9. URL路由
  10. 表单处理
  11. 用户认证与权限
  12. Django Admin
  13. 高级主题
  14. 总结

引言

Django是一个高级Python Web框架,它鼓励快速开发和干净、实用的设计。Django遵循“Don’t Repeat Yourself”(DRY)原则,旨在帮助开发者快速构建复杂的、数据库驱动的网站。无论你是初学者还是经验丰富的开发者,Django都能为你提供强大的工具和功能,帮助你高效地完成项目。

本文将带你从Django的基础知识开始,逐步深入到高级主题,涵盖模型、视图、模板、URL路由、表单处理、用户认证、Django Admin等内容。我们还将通过示例代码和案例来帮助你更好地理解和应用这些概念。

Django简介

Django最初是由Adrian Holovaty和Simon Willison在2003年开发的,目的是为了简化新闻网站的创建过程。自2005年发布以来,Django已经成为最受欢迎的Python Web框架之一。它被广泛应用于各种类型的项目,从小型博客到大型企业级应用。

Django的主要特点包括:

  • 快速开发:Django提供了许多内置功能,如ORM、模板引擎、表单处理等,使得开发者可以快速构建应用。
  • 安全性:Django内置了许多安全功能,如防止SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等。
  • 可扩展性:Django的设计允许开发者轻松地扩展和定制框架的功能。
  • 社区支持:Django拥有一个活跃的社区,提供了大量的文档、教程和第三方库。

安装与配置

在开始使用Django之前,你需要先安装它。Django可以通过Python的包管理工具pip来安装。

安装Django

打开终端或命令提示符,运行以下命令来安装Django:

pip install django

安装完成后,你可以通过以下命令来验证Django是否安装成功:

django-admin --version

如果安装成功,你将看到Django的版本号。

创建Django项目

安装完成后,你可以使用django-admin命令来创建一个新的Django项目。假设我们要创建一个名为myproject的项目,可以运行以下命令:

django-admin startproject myproject

这将创建一个名为myproject的目录,其中包含Django项目的基本结构。

运行开发服务器

进入项目目录并启动开发服务器:

cd myproject
python manage.py runserver

默认情况下,开发服务器将在http://127.0.0.1:8000/上运行。打开浏览器并访问该地址,你将看到Django的欢迎页面。

创建第一个Django项目

项目结构

在创建了Django项目后,你会看到以下目录结构:

myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  • manage.py:一个命令行工具,用于与Django项目进行交互。
  • myproject/:项目的实际Python包。
    • settings.py:项目的配置文件。
    • urls.py:项目的URL路由配置。
    • wsgi.py:用于部署项目的WSGI配置。
    • asgi.py:用于部署项目的ASGI配置。

创建应用

Django项目由多个应用(apps)组成。每个应用都是一个独立的模块,负责处理特定的功能。我们可以使用manage.py来创建一个新的应用。

假设我们要创建一个名为blog的应用,可以运行以下命令:

python manage.py startapp blog

这将创建一个名为blog的目录,其中包含应用的基本结构。

注册应用

创建应用后,我们需要将其添加到项目的INSTALLED_APPS设置中。打开myproject/settings.py文件,找到INSTALLED_APPS列表,并添加blog应用:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',  # 添加blog应用
]

Django的MVT架构

Django遵循MVT(Model-View-Template)架构模式,这与传统的MVC(Model-View-Controller)模式类似。MVT架构将应用程序分为三个主要部分:

  • Model:负责处理与数据库的交互,定义数据结构。
  • View:负责处理业务逻辑,接收请求并返回响应。
  • Template:负责处理用户界面的呈现,生成HTML页面。

MVT工作流程

  1. 请求到达:用户通过浏览器发送请求到Django应用。
  2. URL路由:Django根据URL路由配置将请求分发到相应的视图。
  3. 视图处理:视图处理请求,可能会与模型交互以获取数据。
  4. 模板渲染:视图将数据传递给模板,模板生成HTML页面。
  5. 响应返回:Django将生成的HTML页面作为响应返回给用户。

模型(Model)

模型是Django中与数据库交互的核心部分。每个模型类对应数据库中的一张表,模型类的属性对应表中的字段。

创建模型

假设我们要创建一个简单的博客应用,其中包含Post模型来表示博客文章。打开blog/models.py文件,并添加以下代码:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

在这个例子中,我们定义了一个Post模型,它有三个字段:

  • title:文章的标题,类型为CharField,最大长度为200个字符。
  • content:文章的内容,类型为TextField,可以存储大量文本。
  • pub_date:文章的发布日期,类型为DateTimeFieldauto_now_add=True表示在创建对象时自动设置为当前时间。

迁移数据库

在定义模型后,我们需要将其应用到数据库中。Django使用迁移(migration)来管理数据库模式的变化。运行以下命令来创建并应用迁移:

python manage.py makemigrations
python manage.py migrate

makemigrations命令会生成迁移文件,migrate命令会将迁移应用到数据库中。

使用Django Shell操作模型

Django提供了一个交互式的Python shell,可以方便地操作模型。运行以下命令启动Django shell:

python manage.py shell

在shell中,你可以创建、查询、更新和删除模型对象。例如:

from blog.models import Post

# 创建一篇新文章
post = Post(title="我的第一篇博客", content="这是博客的内容。")
post.save()

# 查询所有文章
posts = Post.objects.all()
for post in posts:
    print(post.title, post.pub_date)

# 更新文章
post.title = "更新后的标题"
post.save()

# 删除文章
post.delete()

视图(View)

视图是Django中处理业务逻辑的部分。它接收HTTP请求并返回HTTP响应。视图可以是函数或类。

函数视图

最简单的视图是函数视图。打开blog/views.py文件,并添加以下代码:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Post

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

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

在这个例子中,我们定义了两个视图函数:

  • index:显示所有博客文章的列表。
  • post_detail:显示单篇博客文章的详细信息。

类视图

Django还提供了基于类的视图(Class-Based Views,CBV),它们比函数视图更灵活和强大。例如,我们可以使用ListViewDetailView来简化视图的编写:

from django.views.generic import ListView, DetailView
from .models import Post

class PostListView(ListView):
    model = Post
    template_name = 'blog/index.html'
    context_object_name = 'posts'

class PostDetailView(DetailView):
    model = Post
    template_name = 'blog/post_detail.html'
    context_object_name = 'post'

URL路由

为了让视图能够处理请求,我们需要将其映射到URL。打开blog/urls.py文件(如果不存在,请创建它),并添加以下代码:

from django.urls import path
from . import views

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

然后,将blog应用的URL配置包含到项目的urls.py中:

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

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

现在,你可以通过以下URL访问博客应用:

  • http://127.0.0.1:8000/blog/:显示所有博客文章的列表。
  • http://127.0.0.1:8000/blog/post/1/:显示ID为1的博客文章的详细信息。

模板(Template)

模板是Django中用于生成HTML页面的部分。Django使用自己的模板语言(DTL)来动态生成内容。

创建模板

blog应用目录下创建一个名为templates/blog/的目录,并在其中创建两个模板文件:index.htmlpost_detail.html

index.html

<!DOCTYPE html>
<html>
<head>
    <title>博客首页</title>
</head>
<body>
    <h1>博客文章列表</h1>
    <ul>
        {% for post in posts %}
            <li><a href="{% url 'post_detail' post.id %}">{{ post.title }}</a></li>
        {% endfor %}
    </ul>
</body>
</html>

post_detail.html

<!DOCTYPE html>
<html>
<head>
    <title>{{ post.title }}</title>
</head>
<body>
    <h1>{{ post.title }}</h1>
    <p>{{ post.content }}</p>
    <p>发布日期:{{ post.pub_date }}</p>
</body>
</html>

模板继承

Django的模板系统支持模板继承,允许你创建一个基础模板,并在其他模板中扩展它。例如,我们可以创建一个基础模板base.html

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}我的博客{% endblock %}</title>
</head>
<body>
    <header>
        <h1>我的博客</h1>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
    <footer>
        <p>&copy; 2023 我的博客</p>
    </footer>
</body>
</html>

然后,在index.htmlpost_detail.html中扩展基础模板:

index.html

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

{% block title %}博客首页{% endblock %}

{% block content %}
    <h1>博客文章列表</h1>
    <ul>
        {% for post in posts %}
            <li><a href="{% url 'post_detail' post.id %}">{{ post.title }}</a></li>
        {% endfor %}
    </ul>
{% endblock %}

post_detail.html

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

{% block title %}{{ post.title }}{% endblock %}

{% block content %}
    <h1>{{ post.title }}</h1>
    <p>{{ post.content }}</p>
    <p>发布日期:{{ post.pub_date }}</p>
{% endblock %}

表单处理

Django提供了强大的表单处理功能,可以轻松地创建和处理HTML表单。

创建表单

假设我们要创建一个表单,允许用户提交新的博客文章。首先,在blog/forms.py文件中定义一个表单类:

from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'content']

处理表单提交

接下来,我们需要在视图中处理表单的提交。打开blog/views.py文件,并添加以下代码:

from django.shortcuts import render, redirect
from .forms import PostForm

def create_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('index')
    else:
        form = PostForm()
    return render(request, 'blog/create_post.html', {'form': form})

创建模板

templates/blog/目录下创建一个名为create_post.html的模板文件:

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

{% block title %}创建新文章{% endblock %}

{% block content %}
    <h1>创建新文章</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">提交</button>
    </form>
{% endblock %}

URL路由

最后,将create_post视图映射到URL。打开blog/urls.py文件,并添加以下代码:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('post/<int:post_id>/', views.post_detail, name='post_detail'),
    path('create/', views.create_post, name='create_post'),
]

现在,你可以通过http://127.0.0.1:8000/blog/create/访问创建新文章的页面。

用户认证与权限

Django内置了用户认证系统,可以轻松地处理用户注册、登录、注销等功能。

用户注册

要允许用户注册,我们可以使用Django的UserCreationForm。打开blog/views.py文件,并添加以下代码:

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

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('index')
    else:
        form = UserCreationForm()
    return render(request, 'blog/register.html', {'form': form})

用户登录

Django提供了LoginView来处理用户登录。打开blog/urls.py文件,并添加以下代码:

from django.contrib.auth import views as auth_views

urlpatterns = [
    path('', views.index, name='index'),
    path('post/<int:post_id>/', views.post_detail, name='post_detail'),
    path('create/', views.create_post, name='create_post'),
    path('register/', views.register, name='register'),
    path('login/', auth_views.LoginView.as_view(template_name='blog/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

用户权限

Django还提供了权限系统,允许你控制用户对特定资源的访问。例如,我们可以限制只有登录用户才能创建新文章:

from django.contrib.auth.decorators import login_required

@login_required
def create_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('index')
    else:
        form = PostForm()
    return render(request, 'blog/create_post.html', {'form': form})

Django Admin

Django自带了一个强大的管理界面,允许你轻松地管理数据库中的数据。

注册模型

要使用Django Admin管理Post模型,我们需要将其注册到Admin中。打开blog/admin.py文件,并添加以下代码:

from django.contrib import admin
from .models import Post

admin.site.register(Post)

访问Admin界面

启动开发服务器并访问http://127.0.0.1:8000/admin/,你将看到Django Admin的登录页面。使用超级用户账户登录后,你可以管理Post模型的数据。

自定义Admin界面

你可以通过自定义ModelAdmin类来定制Admin界面的显示和行为。例如:

from django.contrib import admin
from .models import Post

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'pub_date')
    list_filter = ('pub_date',)
    search_fields = ('title', 'content')

admin.site.register(Post, PostAdmin)

高级主题

中间件

Django的中间件是一个轻量级的插件系统,允许你在请求和响应的处理过程中插入自定义逻辑。你可以通过编写中间件类来实现全局的请求处理、响应处理、异常处理等功能。

信号

Django的信号系统允许你在某些事件发生时执行特定的操作。例如,你可以在保存模型对象时发送信号,并在信号处理函数中执行额外的逻辑。

缓存

Django提供了多种缓存后端,包括内存缓存、文件缓存、数据库缓存等。你可以通过配置缓存来提高应用的性能。

国际化

Django支持多语言应用,允许你轻松地将应用翻译成多种语言。你可以通过配置语言文件和使用翻译函数来实现国际化。

测试

Django内置了测试框架,允许你编写单元测试、集成测试和功能测试。你可以使用TestCase类来编写测试用例,并使用Client类来模拟HTTP请求。

总结

Django是一个功能强大且灵活的Web框架,适用于各种类型的项目。通过本文的介绍,你应该已经掌握了Django的基础知识,并能够开始构建自己的Web应用。随着你对Django的深入了解,你将发现它提供了许多高级功能和工具,可以帮助你更高效地开发和维护应用。

希望本文对你有所帮助,祝你在Django的学习和开发过程中取得成功!

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

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

相关文章

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…

ChatGPT-4o和ChatGPT-4o mini的差异点

在人工智能领域&#xff0c;OpenAI再次引领创新潮流&#xff0c;近日正式发布了其最新模型——ChatGPT-4o及其经济实惠的小型版本ChatGPT-4o Mini。这两款模型虽同属于ChatGPT系列&#xff0c;但在性能、应用场景及成本上展现出显著的差异。本文将通过图文并茂的方式&#xff0…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…

机器学习中的关键概念:通过SKlearn的MNIST实验深入理解

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库&#xff0c;提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上&#xff0c;支持…

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)

理解Linux系统内进程信号的整个流程可分为&#xff1a; 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生&#xff0c;本文会讲解信号的保存和信号处理相关的概念和操作&#xff1a; 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…

OpenAI新商标申请曝光:AI硬件、机器人、量子计算全线布局?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

python学opencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理

【1】引言 前序学习了均值滤波和中值滤波&#xff0c;对图像的滤波处理有了基础认知&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;五十四&#xff09;使用cv2.blur()函数实现图像像素均值处理-CSDN博客 python学opencv|读取图像&#xff08;…

【C语言深入探索】:指针高级应用与极致技巧(二)

目录 一、指针与数组 1.1. 数组指针 1.2. 指向多维数组的指针 1.2.1. 指向多维数组元素的指针 1.2.2. 指向多维数组行的指针 1.3. 动态分配多维数组 1.4. 小结 二、指针与字符串 2.1. 字符串表示 2.2. 字符串处理函数 2.3. 代码示例 2.4. 注意事项 三、指针与文件…

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

蓝桥杯刷题 DAY4:小根堆 区间合并+二分

import os import sys import heapq# 请在此输入您的代码if __name__"__main__":x,n map(int,input().split())l[]a[0]*nb[0]*nc[0]*nq[]for i in range(n):l.append(list( map( int ,input().split()) ))l.sort(keylambda pair:-pair[1])total0j0for i in range(x,0…

K8S学习笔记-------1.安装部署K8S集群环境

1.修改为root权限 #sudo su 2.修改主机名 #hostnamectl set-hostname k8s-master01 3.查看网络地址 sudo nano /etc/netplan/01-netcfg.yaml4.使网络配置修改生效 sudo netplan apply5.修改UUID&#xff08;某些虚拟机系统&#xff0c;需要设置才能生成UUID&#xff09;#…

大语言模型深度研究功能:人类认知与创新的新范式

在人工智能迅猛发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;的深度研究功能正在成为重塑人类认知方式的关键力量。这一突破性技术不仅带来了工具层面的革新&#xff0c;更深刻地触及了人类认知能力的本质。本文将从认知科学的角度出发&#xff0c;探讨LLM如何…

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

文章目录 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f;答案&#xff1a;主要特点&#xff1a; 2. Redis 的数据结构有哪些&#xff1f;分别适用于什么场景&#xff1f;答案&#xff1a;keys *命令返回的键顺序 3. Redis 的持久化机制有哪些&#xff1f;它们的优…

基于SpringBoot的物资管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【力扣】53.最大子数组和

AC截图 题目 思路 这道题主要考虑的就是要排除负数带来的负面影响。如果遍历数组&#xff0c;那么应该有如下关系式&#xff1a; currentAns max(prenums[i],nums[i]) pre是之前记录的最大和&#xff0c;如果prenums[i]小于nums[i]&#xff0c;就要考虑舍弃pre&#xff0c;从…

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…

代码随想录算法【Day36】

Day36 1049. 最后一块石头的重量 II 思路 把石头尽可能分成两堆&#xff0c;这两堆重量如果相似&#xff0c;相撞后所剩的值就是最小值 若石头的总质量为sum&#xff0c;可以将问题转化为0-1背包问题&#xff0c;即给一个容量为sum/2的容器&#xff0c;如何尽量去凑满这个容…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.28 NumPy+Matplotlib:科学可视化的核心引擎

2.28 NumPyMatplotlib&#xff1a;科学可视化的核心引擎 目录 #mermaid-svg-KTB8Uqiv5DLVJx7r {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KTB8Uqiv5DLVJx7r .error-icon{fill:#552222;}#mermaid-svg-KTB8Uqiv5…

基序和纯度分数的计算

以下对这两个概念的详细解释&#xff1a; 基序 纯度分数 PWM矩阵的来源 为什么会有PWM矩阵&#xff1f; 一个特定的转录因子&#xff08;TF&#xff09;的结合位点的基序&#xff08;motif&#xff09;并不是唯一的。实际上&#xff0c;TF结合位点通常具有一定的序列变异性&a…

Linux下的编辑器 —— vim

目录 1.什么是vim 2.vim的模式 认识常用的三种模式 三种模式之间的切换 命令模式和插入模式的转化 命令模式和底行模式的转化 插入模式和底行模式的转化 3.命令模式下的命令集 光标移动相关的命令 复制粘贴相关命令 撤销删除相关命令 查找相关命令 批量化注释和去…