Django学习笔记一:MVT的示例
Django是一个功能强大的Web框架,它采用了MVT(Model-View-Template)架构,简化了Web应用程序的开发过程。在这篇文章中,我们将深入探讨MVT模式,并通过具体案例来理解每个组件的作用及其在实际项目中的应用。
目录
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 Codedjango-admin startproject myblog
cd myblog
django-admin startapp blog
项目的文件结构如下:
Copy Codemyblog/
├── 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 Codefrom 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 Codepython manage.py makemigrations blog python manage.py migrate
视图的实现
在blog/views.py
中,我们定义视图函数,以处理用户请求:
pythonCopy Codefrom 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 Codefrom 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 CodeSTATIC_URL = '/static/'
然后在模板中引入静态文件:
htmlCopy Code<link rel="stylesheet" href="{% static 'css/style.css' %}">
<script src="{% static 'js/script.js' %}"></script>
表单处理
在视图中,我们可以使用Django的表单系统来处理表单数据。首先创建一个表单类:
pythonCopy Codefrom django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
然后在视图中使用这个表单:
pythonCopy Codedef 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模式有所帮助!