django通用视图的DetailView

更新时间:2023-06-26 06:03:14 阅读: 评论:0

django通⽤视图的DetailView SingleObjectMixin
主要功能:
葫芦叶
1. def get_queryt(lf):返回query_t⾥的所有对象
1. 如果提供的queryt为空且model不为空,返回lf.model._default_manager.all()
2. 提供了queryt,返回lf.queryt.all()
2. get_object(lf, queryt=None):根据请求url⾥的关键字参数pk或者slug过滤query_t来获取单⼀对象(obj)金口才
queryt = queryt.filter(pk=pk)或者 queryt = queryt.filter(**{slug_field: slug})
obj = ()
return obj
3. def get_context_data(lf, **kwargs):将对象(obj)其插⼊到渲染模板所需的上下⽂中
lf.object= lf.get_object
context['object']= lf.object
# 或者可以⾃定义对象名,两者是同时存在的:
context[context_object_name]= lf.object
class SingleObjectMixin(ContextMixin):
"""
提供了可以操纵检索单⼀对象的能⼒
"""
model =None
queryt =None
slug_field ='slug'
context_object_name =None
皑皑白雪读音slug_url_kwarg ='slug'
pk_url_kwarg ='pk'
query_pk_and_slug =Fal
def get_object(lf, queryt=None):
你来比划我来猜题目# 根据pk和slug查找object
# 如果⾃定义了queryt就使⽤它,这是⼦类需要的
# ⽐如DateDetailView
if queryt is None:
queryt = lf.get_queryt()
# 接着试着查询pk
pk = (lf.pk_url_kwarg)
slug = (lf.slug_url_kwarg)
if pk is not None:
queryt = queryt.filter(pk=pk)
# 接着试着查询slug
if slug is not None and(pk is None or lf.query_pk_and_slug):
slug_field = lf.get_slug_field()
queryt = queryt.filter(**{slug_field: slug})
# If none of tho are defined, it's an error.
if pk is None and slug is None:
rai AttributeError(
腊猪头"Generic detail view %s must be called with either an object "
"pk or a slug in the URLconf."% lf.__class__.__name__
)
try:
# Get the single item from the filtered queryt
obj = ()
del.DoesNotExist:
rai Http404(_("No %(verbo_name)s found matching the query")%
{'verbo_name': del._meta.verbo_name})
return obj
def get_context_data(lf,**kwargs):
"""插⼊单⼀对象到上下⽂字典中"""
context ={}
if lf.object:
context['object']= lf.object
context_object_name = lf.get_context_object_name(lf.object)
天空霸主
if context_object_name:
context[context_object_name]= lf.object
context.update(kwargs)
return super().get_context_data(**context)
BaDetailView
BaDetailView主要是组合SingleObjectMixin和view的各种⽅法来实现服务器处理⼀个获取单⼀对象的get请求的⼀般流程。
class BaDetailView(SingleObjectMixin, View):
"""⼀个展⽰单⼀对象的基本视图"""
def get(lf, request,*args,**kwargs):
lf.object= lf.get_object()
context = lf.get_context_data(object=lf.object)
der_to_respon(context) SingleObjectTemplateResponMixin
SingleObjectTemplateResponMixin主要是重写了get_template_names⽅法,也就是其模板的名字是app_label + model_name(⼩写) + template_name_suffix(_detail)
class SingleObjectTemplateResponMixin(TemplateResponMixin):
template_name_field =None
template_name_suffix ='_detail'
def get_template_names(lf):
古代名画
# 省略....
if isinstance(lf.object, models.Model):
object_meta = lf.object._meta
names.append("%s/%s%s.html"%(
object_meta.app_label,
del_name,
))
elif getattr(lf,'model',None)is not None and del, models.Model):
names.append("%s/%s%s.html"%(
take的短语
))
return names
DetailView
class DetailView(SingleObjectTemplateResponMixin, BaDetailView):
"""
Render a "detail" view of an object.
By default this is a model instance looked up from `lf.queryt`, but the
view will support display of *any* object by overriding `lf.get_object()`.
"""
总结
1. _context_data获取含有单个对象的上下⽂(context)
2. der_to_respon利⽤上下⽂进⾏渲染并返回响应,并重写其
get_template_names⽅法
3. BaDetailView组合SingleObjectMixin和View并实现get请求和分发
4. DetailView组合SingleObjectTemplateResponMixin和BaDetailView实现完整的逻辑处理

本文发布于:2023-06-26 06:03:14,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1041673.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   实现   请求   获取
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图