视图(Views)
在 Django 中,视图(View) 是处理 HTTP 请求并返回响应的核心组件。视图通常用于接收用户请求、查询数据库、处理数据,并返回 HTML 页面或 JSON 数据。
Django 提供了三种主要的视图方式:
- 函数视图(Function-Based Views, FBV)
- 类视图(Class-Based Views, CBV)
- 通用视图(Generic Views)
1. 函数视图(Function-Based Views, FBV)
函数视图是 Django 传统的视图写法,它使用 Python 函数来定义 HTTP 请求的处理逻辑。
基本示例
在 views.py
中:
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello, Django!")
在 urls.py
中:
from django.urls import path
from .views import hello_world
urlpatterns = [
path('hello/', hello_world),
]
访问 http://localhost:8000/hello/
,浏览器会显示 Hello, Django!
。
处理 HTML 响应
使用 render()
函数渲染模板:
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
Django 会自动在 templates/home.html
中查找模板文件,并返回渲染后的 HTML。
传递数据到模板
def home(request):
context = {
'title': 'Django 视图示例',
'message': '欢迎来到 Django 学习之旅!'
}
return render(request, 'home.html', context)
在 home.html
中:
<h1>{{ title }}</h1>
<p>{{ message }}</p>
处理表单数据
def submit_form(request):
if request.method == "POST":
name = request.POST.get("name")
return HttpResponse(f"Hello, {name}!")
return render(request, "form.html")
在 form.html
:
<form method="POST">
{% csrf_token %}
<input type="text" name="name">
<button type="submit">提交</button>
</form>
使用 JsonResponse
处理 API 请求
from django.http import JsonResponse
def api_data(request):
data = {"name": "Django", "version": "4.0"}
return JsonResponse(data)
访问该视图时,返回 JSON 格式数据:
{"name": "Django", "version": "4.0"}
2. 类视图(Class-Based Views, CBV)
Django 允许使用类视图(CBV)来组织视图逻辑,使代码更清晰和可重用。
基本类视图
from django.views import View
from django.http import HttpResponse
class HelloWorldView(View):
def get(self, request):
return HttpResponse("Hello from class-based view!")
在 urls.py
中:
from django.urls import path
from .views import HelloWorldView
urlpatterns = [
path('hello-class/', HelloWorldView.as_view()), # 注意这里使用 as_view()
]
使用 TemplateView
渲染模板
TemplateView
适用于静态页面:
from django.views.generic import TemplateView
class HomePageView(TemplateView):
template_name = "home.html"
urls.py
:
urlpatterns = [
path('', HomePageView.as_view()),
]
处理 GET 和 POST 请求
class MyView(View):
def get(self, request):
return HttpResponse("这是 GET 请求")
def post(self, request):
return HttpResponse("这是 POST 请求")
3. 通用视图(Generic Views)
Django 提供了一些 预定义的通用视图(Generic Views),用于处理常见模式,如列表、详情页、创建、更新和删除操作。
(1)ListView
- 列表视图
ListView
用于显示数据库对象的列表:
from django.views.generic import ListView
from .models import BlogPost
class BlogListView(ListView):
model = BlogPost # 绑定数据模型
template_name = 'blog_list.html' # 指定模板
context_object_name = 'posts' # 传递给模板的变量名
urls.py
:
urlpatterns = [
path('blogs/', BlogListView.as_view(), name='blog-list'),
]
blog_list.html
:
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
{% endfor %}
(2)DetailView
- 详情视图
DetailView
用于显示单个对象的详细信息:
from django.views.generic import DetailView
from .models import BlogPost
class BlogDetailView(DetailView):
model = BlogPost
template_name = 'blog_detail.html'
context_object_name = 'post'
urls.py
:
urlpatterns = [
path('blogs/<int:pk>/', BlogDetailView.as_view(), name='blog-detail'),
]
blog_detail.html
:
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
(3)CreateView
- 创建视图
CreateView
用于创建新对象:
from django.views.generic import CreateView
from .models import BlogPost
from django.urls import reverse_lazy
class BlogCreateView(CreateView):
model = BlogPost
fields = ['title', 'content', 'author']
template_name = 'blog_form.html'
success_url = reverse_lazy('blog-list') # 创建成功后跳转
(4)UpdateView
- 更新视图
UpdateView
用于修改已有对象:
from django.views.generic import UpdateView
class BlogUpdateView(UpdateView):
model = BlogPost
fields = ['title', 'content']
template_name = 'blog_form.html'
success_url = reverse_lazy('blog-list')
(5)DeleteView
- 删除视图
DeleteView
用于删除对象:
from django.views.generic import DeleteView
class BlogDeleteView(DeleteView):
model = BlogPost
template_name = 'blog_confirm_delete.html'
success_url = reverse_lazy('blog-list')
blog_confirm_delete.html
:
<form method="POST">
{% csrf_token %}
<p>确定要删除 "{{ post.title }}" 吗?</p>
<button type="submit">删除</button>
</form>
4. 视图装饰器(View Decorators)
Django 提供了一些 装饰器,用于控制视图访问权限:
装饰器 | 作用 |
---|---|
@login_required | 仅允许已登录用户访问 |
@permission_required('app_label.permission') | 需要特定权限 |
@csrf_exempt | 取消 CSRF 保护 |
示例:
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def dashboard(request):
return render(request, "dashboard.html")
总结
- 函数视图 适用于简单逻辑。
- 类视图 更加结构化,适用于复杂视图。
- 通用视图 处理常见模式,如列表、详情、创建、更新和删除,提高开发效率。
掌握 Django 视图后,你可以根据需求灵活选择合适的方式,提高 Web 开发效率。🚀