django从入门到实战(三)——CBV视图介绍
在 Django 中,不同类型的视图(如数据显示视图、数据操作视图和日期筛选视图)都有各自的方法和参数。以下是对这些视图及其方法的详细介绍。
1. 数据显示视图
1.1 重定向视图
方法:
redirect()
: 用于重定向到另一个 URL。
使用示例:
from django.shortcuts import redirect
def my_view(request):
# 处理某些逻辑
return redirect('home') # 重定向到首页
参数:
to
: 可以是 URL 字符串、URL 名称或一个可调用对象。permanent
: 布尔值,指示是否进行永久重定向(默认值为False
)。
1.2 基础视图
方法:
HttpResponse()
: 返回简单的文本或 HTML 内容。
使用示例:
from django.http import HttpResponse
def basic_view(request):
return HttpResponse("这是一个基础视图")
参数:
content
: 响应内容(字符串)。status
: HTTP 状态码(默认值为 200)。content_type
: 响应内容类型(如text/html
)。
1.3 列表视图
方法:
get_queryset()
: 返回要显示的对象列表。get_context_data()
: 返回上下文数据。
使用示例:
from django.views.generic import ListView
from .models import Post
class PostListView(ListView):
model = Post
template_name = 'post_list.html'
context_object_name = 'posts'
def get_queryset(self):
return Post.objects.filter(published=True) # 只显示已发布的帖子
参数:
model
: 关联的模型类。template_name
: 使用的模板名称。context_object_name
: 上下文变量名称(默认为object_list
)。
1.4 详细视图
方法:
get_object()
: 返回要显示的对象。get_context_data()
: 返回上下文数据。
使用示例:
from django.views.generic import DetailView
from .models import Post
class PostDetailView(DetailView):
model = Post
template_name = 'post_detail.html'
context_object_name = 'post'
def get_object(self):
return super().get_object() # 获取当前帖子对象
参数:
model
: 关联的模型类。template_name
: 使用的模板名称。context_object_name
: 上下文变量名称(默认为object
)。
2. 数据操作视图
2.1 表单视图
方法:
form_valid()
: 处理有效表单提交。form_invalid()
: 处理无效表单提交。get_form()
: 获取表单实例。
使用示例:
from django.views.generic.edit import FormView
from .forms import PostForm
class PostCreateView(FormView):
template_name = 'post_form.html'
form_class = PostForm
success_url = '/posts/'
def form_valid(self, form):
form.save() # 保存表单数据
return super().form_valid(form)
参数:
template_name
: 使用的模板名称。form_class
: 表单类。success_url
: 提交成功后重定向的 URL。
2.2 新增视图
新增视图通常与表单视图结合使用,允许用户创建新记录。使用 FormView
或 CreateView
。
示例:
from django.views.generic.edit import CreateView
class PostCreateView(CreateView):
model = Post
template_name = 'post_form.html'
form_class = PostForm
success_url = '/posts/'
参数:
model
: 关联的模型类。template_name
: 使用的模板名称。form_class
: 表单类。success_url
: 提交成功后重定向的 URL。
2.3 修改视图
修改视图用于更新现有记录,使用 UpdateView
。
示例:
from django.views.generic.edit import UpdateView
class PostUpdateView(UpdateView):
model = Post
template_name = 'post_form.html'
form_class = PostForm
success_url = '/posts/'
参数:
model
: 关联的模型类。template_name
: 使用的模板名称。form_class
: 表单类。success_url
: 提交成功后重定向的 URL。
2.4 删除视图
删除视图用于删除现有记录,使用 DeleteView
。
示例:
from django.views.generic.edit import DeleteView
class PostDeleteView(DeleteView):
model = Post
template_name = 'post_confirm_delete.html'
success_url = '/posts/'
参数:
model
: 关联的模型类。template_name
: 使用的模板名称。success_url
: 删除成功后重定向的 URL。
3. 日期筛选视图
3.1 月份视图
方法:
get_queryset()
: 返回特定月份的数据。
使用示例:
from django.shortcuts import render
from .models import Post
def posts_by_month(request, year, month):
posts = Post.objects.filter(
created_at__year=year,
created_at__month=month
)
return render(request, 'posts_by_month.html', {'posts': posts})
参数:
year
: 年份(整数)。month
: 月份(整数)。
3.2 周期视图
方法:
get_queryset()
: 返回特定时间段的数据。
使用示例:
from django.shortcuts import render
from .models import Post
def posts_in_period(request, start_date, end_date):
posts = Post.objects.filter(
created_at__range=[start_date, end_date]
)
return render(request, 'posts_in_period.html', {'posts': posts})
参数:
start_date
: 开始日期(字符串或日期对象)。end_date
: 结束日期(字符串或日期对象)。