View 视图

20 阅读3分钟

视图(Views)

在 Django 中,视图(View) 是处理 HTTP 请求并返回响应的核心组件。视图通常用于接收用户请求、查询数据库、处理数据,并返回 HTML 页面或 JSON 数据。

Django 提供了三种主要的视图方式:

  1. 函数视图(Function-Based Views, FBV)
  2. 类视图(Class-Based Views, CBV)
  3. 通用视图(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 开发效率。🚀