Django 视图基础
Django 视图是处理用户请求并返回响应的核心组件。视图可以是函数或类,通常定义在views.py文件中。
函数视图示例:
from django.http import HttpResponse def hello_world(request): return HttpResponse("Hello, World!")类视图示例:
from django.views import View from django.http import HttpResponse class HelloWorldView(View): def get(self, request): return HttpResponse("Hello, World!")URL 配置
视图需要通过 URL 配置映射到具体的路由。在urls.py中配置:
函数视图 URL:
from django.urls import path from .views import hello_world urlpatterns = [ path('hello/', hello_world), ]类视图 URL:
from django.urls import path from .views import HelloWorldView urlpatterns = [ path('hello/', HelloWorldView.as_view()), ]请求与响应
Django 视图通过request对象接收请求数据,并通过HttpResponse或其子类返回响应。
获取请求数据:
def show_data(request): name = request.GET.get('name', 'Guest') return HttpResponse(f"Hello, {name}!")返回 JSON 响应:
from django.http import JsonResponse def json_response(request): data = {'key': 'value'} return JsonResponse(data)模板渲染
Django 视图可以渲染 HTML 模板,动态生成页面内容。
配置模板:
- 在
settings.py中确保TEMPLATES配置正确。 - 创建模板文件(如
templates/my_template.html)。
渲染模板:
from django.shortcuts import render def template_view(request): context = {'variable': 'value'} return render(request, 'my_template.html', context)类视图进阶
Django 提供了多种内置类视图简化常见任务,如ListView、DetailView等。
使用ListView:
from django.views.generic import ListView from .models import MyModel class MyModelListView(ListView): model = MyModel template_name = 'my_model_list.html' context_object_name = 'objects'使用DetailView:
from django.views.generic import DetailView from .models import MyModel class MyModelDetailView(DetailView): model = MyModel template_name = 'my_model_detail.html'表单处理
视图可以处理表单提交,验证数据并保存到数据库。
表单视图示例:
from django.shortcuts import render, redirect from .forms import MyForm def form_view(request): if request.method == 'POST': form = MyForm(request.POST) if form.is_valid(): form.save() return redirect('success_url') else: form = MyForm() return render(request, 'form_template.html', {'form': form})认证与权限
Django 提供装饰器和混入类实现认证和权限控制。
使用@login_required:
from django.contrib.auth.decorators import login_required @login_required def protected_view(request): return HttpResponse("Protected content")类视图使用LoginRequiredMixin:
from django.contrib.auth.mixins import LoginRequiredMixin from django.views import View class ProtectedView(LoginRequiredMixin, View): def get(self, request): return HttpResponse("Protected content")文件上传
视图可以处理文件上传,保存文件到指定位置。
文件上传示例:
def upload_file(request): if request.method == 'POST' and request.FILES['file']: uploaded_file = request.FILES['file'] with open('uploads/' + uploaded_file.name, 'wb+') as destination: for chunk in uploaded_file.chunks(): destination.write(chunk) return HttpResponse("File uploaded successfully") return render(request, 'upload.html')