18 Django视图之视图和模型的交互

在上一篇教程中,我们介绍了如何配置Django的URL,这为我们接下来的视图逻辑打下了基础。本篇文章将重点讨论Django视图与模型的交互,帮助你理解如何通过视图来处理数据并与模型进行交互。

理解视图与模型的关系

在Django中,视图是处理HTTP请求和返回HTTP响应的函数或类,而模型则是定义数据结构和数据库交互的类。视图和模型之间的交互是通过Django的ORM(对象关系映射)来实现的。

基本模型

首先,我们需要定义一个模型。假设我们正在创建一个简单的博客应用,其中包含文章(Article)模型。我们可以在models.py中定义如下:

1
2
3
4
5
6
7
8
9
from django.db import models

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

def __str__(self):
return self.title

在这个Article模型中,我们定义了三个字段:titlecontent,和created_at。每当一个新的Article实例被创建时,created_at字段会自动保存创建时间。

创建视图

接下来,我们需要在视图中处理与模型的交互。例如,我们想要显示所有的文章列表。我们可以在views.py中定义一个视图来完成这个任务:

1
2
3
4
5
6
from django.shortcuts import render
from .models import Article

def article_list(request):
articles = Article.objects.all() # 从数据库获取所有文章
return render(request, 'article_list.html', {'articles': articles})

在上面的代码中,我们创建了一个名为article_list的视图。这个视图使用Article.objects.all()方法从数据库中获取所有文章,并将其传递给模板article_list.html

配置URL

我们需要在urls.py中配置这个视图,以便用户可以访问文章列表页面:

1
2
3
4
5
6
from django.urls import path
from .views import article_list

urlpatterns = [
path('articles/', article_list, name='article_list'),
]

现在,访问/articles/路径时,会触发article_list视图并显示所有文章。

使用模板展示数据

接下来,我们需要创建一个模板来展示文章的信息。在templates/article_list.html文件中,我们可以这样编写模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Article List</title>
</head>
<body>
<h1>Articles</h1>
<ul>
{% for article in articles %}
<li>
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
<small>Created at {{ article.created_at }}</small>
</li>
{% endfor %}
</ul>
</body>
</html>

在这个模板中,我们使用了Django的模板语言把articles变量中的每一篇文章的标题、内容和创建时间都展示出来。

处理文章的创建

除了展示文章,我们也希望能够创建新的文章。我们可以为此创建一个新的视图和模板。

首先,在views.py中添加一个用于处理文章创建的视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.shortcuts import redirect
from django.http import HttpResponse
from .forms import ArticleForm

def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save() # 保存到数据库
return redirect('article_list') # 创建成功,重定向到文章列表
else:
form = ArticleForm()
return render(request, 'create_article.html', {'form': form})

在这个视图中,我们通过ArticleForm来处理表单输入。当接收到POST请求时,我们验证数据并保存到数据库,成功后重定向到文章列表。

创建表单

我们需要创建ArticleForm类,用于处理文章的输入。在forms.py中:

1
2
3
4
5
6
7
from django import forms
from .models import Article

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

这个表单将生成一个用于输入文章标题和内容的表单。

创建文章的模板

创建一个新的模板create_article.html,用于展示文章创建的表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Create Article</title>
</head>
<body>
<h1>Create New Article</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</body>
</html>

注意这里我们使用了{% csrf_token %}来防止跨站请求伪造攻击。

总结

在这一篇中,我们学习了如何通过Django视图和模型进行交互,创建和展示文章列表,以及如何创建新的文章。视图负责处理逻辑,而模型则负责与数据库的交互。在下一篇中,我们将深入了解Django模板语言,通过动态生成HTML来渲染数据。

希望你已经对视图和模型的交互有了清晰的认识,现在你可以开始构建你的应用了!

18 Django视图之视图和模型的交互

https://zglg.work/django-zero/18/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论