在Django中,ListView 和 DetailView都是基于类的视图,在处理请求时通常会自动调用render_to_response函数,但由于项目需求不同,实现时需要重写render_to_response函数
ListView 和 DetailView介绍
- ListView 介绍
- 主要用于展示一个模型的多个实例(即一个查询集)。
- 在处理请求时,会自动获取查询集并将其传递给模板。
- DetailView:
- 主要用于展示一个模型的单个实例。
- 在处理请求时,会根据 URL 中的参数获取特定对象并将其传递给模板。
render_to_response函数的使用案例
- 继承ListView类
bash
class SightTicketListView(ListView):
# 景点门票列表
paginate_by = 10
def get_queryset(self):
# 根据景点id查询
sight_id = self.kwargs.get('pk',None)
return Ticket.objects.filter(is_valid=True,sight=sight_id)
def render_to_response(self, context, **response_kwargs):
page_obj = context['page_obj']
if page_obj is not None:
data = serializers.TicketListSerializers(page_obj).to_dict()
return http.JsonResponse(data)
return NotFoundJsonResponse()
- 继承DetailView类
bash
class SightInfoDetailView(DetailView):
# 当地址pk为none为空时,以下配置会生效
pk_url_kwarg = None
# url中参数的名称
slug_url_kwarg = 'pk'
# url中pk对应的哪一个字段(数据库中的字段)
slug_field = 'sight__pk'
# 景点详情
def get_queryset(self):
# 根据id获取景点详情
return Info.objects.all()
def render_to_response(self, context, **response_kwargs):
page_obj = context['object']
if page_obj is not None:
data = serializers.SightInfoSerializer(page_obj).to_dict()
return http.JsonResponse(data)
return NotFoundJsonResponse()
context['page_obj'] 和 context['object'] 在 Django 的类视图中有不同的用途:
- context['page_obj']:
- 主要用于 ListView 中,表示分页的对象,包含当前页面的数据以及分页信息。
- 可以用于渲染分页导航,例如显示当前页、总页数等。
-
context['object']:
- 用于 DetailView 中,表示当前请求的单个对象实例。
- 直接用于渲染该对象的详细信息。
总结
- 使用 context['page_obj'] 时,通常涉及多个对象的分页展示。
- 使用 context['object'] 时,主要关注单个对象的展示。