1. Django视图基础与实战
Django视图作为Web应用的核心处理器,承担着接收请求、执行业务逻辑和返回响应的关键职责。让我们从最基本的视图函数开始,逐步深入到实际开发中的各种应用场景。
1.1 函数视图的完整实现
函数视图是Django中最基础的视图形式,通过简单的Python函数实现请求处理。一个完整的视图函数需要考虑以下要素:
python复制from django.http import HttpResponse, Http404
from django.shortcuts import get_object_or_404
from .models import Article
def article_detail(request, article_id):
"""
文章详情视图
:param request: HttpRequest对象
:param article_id: 文章ID
:return: HttpResponse对象
"""
try:
article = get_object_or_404(Article, pk=article_id)
content = f"""
<h1>{article.title}</h1>
<p>作者:{article.author}</p>
<div>{article.content}</div>
<p>发布时间:{article.publish_date}</p>
"""
return HttpResponse(content)
except Article.DoesNotExist:
raise Http404("文章不存在")
实际开发中建议使用模板系统而非硬编码HTML,这里仅为演示视图函数的基本结构
关键点说明:
- 每个视图函数第一个参数必须是
request对象 - 通过
get_object_or_404快捷方式处理对象不存在情况 - 返回的HttpResponse可以包含任何合法的HTTP内容
- 应该明确处理各种异常情况
1.2 类视图的体系结构
Django的类视图通过面向对象的方式提供了更结构化的视图实现。理解类视图的继承体系至关重要:
code复制View (基础视图)
├── TemplateView (模板视图)
├── RedirectView (重定向视图)
├── FormView (表单视图)
│ ├── CreateView (创建视图)
│ ├── UpdateView (更新视图)
│ └── DeleteView (删除视图)
└── ListView (列表视图)
└── DetailView (详情视图)
典型类视图实现示例:
python复制from django.views.generic import DetailView
from .models import Product
class ProductDetailView(DetailView):
model = Product
template_name = 'products/detail.html'
context_object_name = 'product'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['related_products'] = Product.objects.filter(
category=self.object.category
).exclude(pk=self.object.pk)[:4]
return context
类视图的核心优势:
- 内置常用功能(分页、模板渲染等)
- 清晰的代码组织结构
- 通过方法重写实现灵活定制
- 内置的HTTP方法处理(get/post等)
1.3 视图中的业务逻辑处理
视图除了基本的请求响应外,还需要处理各种业务逻辑。以下是几个典型场景的实现:
表单处理示例:
python复制from django.views.generic.edit import FormView
from .forms import ContactForm
from django.urls import reverse_lazy
class ContactView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = reverse_lazy('thank-you')
def form_valid(self, form):
# 这里处理表单数据
form.send_email()
return super().form_valid(form)
文件上传处理:
python复制from django.views import View
from django.shortcuts import render
from .forms import UploadFileForm
class FileUploadView(View):
def get(self, request):
form = UploadFileForm()
return render(request, 'upload.html
