Django类视图CBV扩展基类之TemplateView、RedirectView

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

类视图基类

除去默认的CBV之外,在此基础上,django还额外提供了更加便捷可以使用的视图基类,具备了基本的获取、添加、删除、修改等操作

基本视图

TemplateView

专注于返回一个模版页面

dispatch()
http_method_not_allowed()
get_context_data()
class TemplateView(TemplateResponseMixin, ContextMixin, View):
    """
    Render a template. Pass keyword arguments from the URLconf to the context.
    """
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

ContextMixin:用以传递上下文变量,只要通过内部的extra_context变量

TemplateResponseMixin:通过给定的上下文字典数据、模版配置、content-type等属性组合在一起,返回关于一个模版页面的response

class TemplateResponseMixin:
    template_name = None	# 模版的名字
    template_engine = None # 模版的引擎
    response_class = TemplateResponse	# render_to_response返回的响应类
    content_type = None # 响应的http类型
  • 基础使用方式,直接在路由处指定名字
path('',TemplateView.as_view(template_name='index.html',extra_context={
    
    'title':'测试'}))
  • 覆写ContextMixin->get_context_data函数
class TemplateViewTest(TemplateView):
    template_name = 'index.html'
    def get_context_data(self, **kwargs):
        if 'view' not in kwargs:
            kwargs['view'] = self
        print(kwargs)
        if self.extra_context is not None:
            kwargs.update(self.extra_context)
        kwargs['data'] = [1,2,3,4,5]
        return kwargs

通过重定义get_context_data函数的方式,可以在模版返回时传递自定义上下文变量


RedirectView

这个视图专注于实现重定向到指定url的功能

dispatch()
http_method_not_allowed()
get_redirect_url()
  • 这是这个视图的源码,非常简单
class RedirectView(View):
    """Provide a redirect on any GET request."""
    permanent = False # 是否为永久重定向,可由pattern_name与get_redirect_url()替代
    url = None # 要跳转的地址
    pattern_name = None # 反向解析的路由命名
    query_string = False # 是否传递get传参
def get_redirect_url(self, *args, **kwargs):
    """
    Return the URL redirect to. Keyword arguments from the URL pattern
    match generating the redirect request are provided as kwargs to this
    method.
    """
    if self.url:
    	url = self.url % kwargs
    elif self.pattern_name:
    	url = reverse(self.pattern_name, args=args, kwargs=kwargs)
    else:
    	return None
    args = self.request.META.get('QUERY_STRING', '')
    if args and self.query_string:
    	url = "%s?%s" % (url, args)
    return url
  • 一般情况下可以通过重构get_redirect_url方法,进行重定向之前的工作,比如访问记录+1等等
def get_redirect_url(self, *args, **kwargs):
	# do something
	return super().get_redirect_url(*args, **kwargs)

猜你喜欢

转载自blog.csdn.net/HeroicLee/article/details/121508028