Django学习笔记一:MVT的示例

Django是一个功能强大的Web框架,它采用了MVT(Model-View-Template)架构,简化了Web应用程序的开发过程。在这篇文章中,我们将深入探讨MVT模式,并通过具体案例来理解每个组件的作用及其在实际项目中的应用。

目录

  1. MVT概述
  2. 案例背景
  3. 项目结构
  4. 模型的实现
  5. 视图的实现
  6. 模板的实现
  7. 路由配置
  8. 静态文件管理
  9. 表单处理
  10. 总结与展望

MVT概述

MVT是一种设计模式,主要用于分离业务逻辑、用户界面和数据模型。Django采用这种模式,使得开发者可以更清晰地组织代码,提高应用的可维护性。

1.1 Model

Model是数据层,负责与数据库交互。它定义了数据的结构和行为。在Django中,Model通常是一个Python类,每个类对应数据库中的一张表。

1.2 View

View是业务逻辑层,负责处理用户请求并返回响应。它从Model中获取数据,并将其传递给Template进行渲染。

1.3 Template

Template是表现层,负责呈现数据。在Django中,Template是HTML文件,可以嵌入动态内容。

案例背景

为了更好地理解MVT模式,我们将创建一个简单的博客系统。该系统允许用户注册、登录、创建文章以及查看文章列表。

项目结构

在开始之前,先创建项目及应用的基本结构。

bashCopy Code
django-admin startproject myblog cd myblog django-admin startapp blog

项目的文件结构如下:

Copy Code
myblog/ ├── myblog/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── blog/ │ ├── migrations/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── tests.py │ └── views.py ├── manage.py

模型的实现

blog/models.py中,我们定义文章模型:

pythonCopy Code
from django.db import models from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title

字段解析

  • title: 文章标题,最大长度为200个字符。
  • content: 文章内容,文本字段。
  • author: 外键,关联到用户模型。
  • created_at: 文章创建时间,自动生成。

接下来,为了使模型生效,我们需要运行迁移命令:

bashCopy Code
python manage.py makemigrations blog python manage.py migrate

视图的实现

blog/views.py中,我们定义视图函数,以处理用户请求:

pythonCopy Code
from django.shortcuts import render, redirect from .models import Post from django.contrib.auth.decorators import login_required @login_required def post_list(request): posts = Post.objects.all().order_by('-created_at') return render(request, 'blog/post_list.html', {'posts': posts}) @login_required def post_create(request): if request.method == 'POST': title = request.POST['title'] content = request.POST['content'] post = Post(title=title, content=content, author=request.user) post.save() return redirect('post_list') return render(request, 'blog/post_create.html')

视图解析

  • post_list: 获取所有文章并渲染到模板中。
  • post_create: 处理文章创建,支持GET和POST请求。

模板的实现

blog/templates/blog/目录下创建以下模板:

1. post_list.html

htmlCopy Code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>文章列表</title> </head> <body> <h1>文章列表</h1> <a href="{% url 'post_create' %}">创建新文章</a> <ul> {% for post in posts %} <li>{{ post.title }} - {{ post.created_at }}</li> {% endfor %} </ul> </body> </html>

2. post_create.html

htmlCopy Code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>创建文章</title> </head> <body> <h1>创建文章</h1> <form method="POST"> {% csrf_token %} <label for="title">标题:</label> <input type="text" name="title" required> <label for="content">内容:</label> <textarea name="content" required></textarea> <button type="submit">提交</button> </form> </body> </html>

路由配置

myblog/urls.py中配置路由:

pythonCopy Code
from django.contrib import admin from django.urls import path from blog import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.post_list, name='post_list'), path('create/', views.post_create, name='post_create'), ]

静态文件管理

为了提升用户体验,可以添加样式和脚本。首先在项目结构中创建一个static目录,然后在settings.py中配置:

pythonCopy Code
STATIC_URL = '/static/'

然后在模板中引入静态文件:

htmlCopy Code
<link rel="stylesheet" href="{% static 'css/style.css' %}"> <script src="{% static 'js/script.js' %}"></script>

表单处理

在视图中,我们可以使用Django的表单系统来处理表单数据。首先创建一个表单类:

pythonCopy Code
from django import forms from .models import Post class PostForm(forms.ModelForm): class Meta: model = Post fields = ['title', 'content']

然后在视图中使用这个表单:

pythonCopy Code
def post_create(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('post_list') else: form = PostForm() return render(request, 'blog/post_create.html', {'form': form})

更新模板

更新post_create.html以使用Django的表单:

htmlCopy Code
<form method="POST"> {% csrf_token %} {{ form.as_p }} <button type="submit">提交</button> </form>

总结与展望

本文介绍了Django的MVT架构,通过创建一个简单的博客系统,详细讲解了Model、View和Template的实现。这是Django开发的基础,但还有更多内容值得深入挖掘,如用户认证、权限管理、RESTful API等。

后续笔记将扩展到更复杂的功能和最佳实践,希望能帮助读者更深入地掌握Django框架。


以上就是Django学习笔记一的内容。希望对你理解MVT模式有所帮助!