美文网首页django的奇技淫巧
Django的基本视图(view、TemplateView、Re

Django的基本视图(view、TemplateView、Re

作者: 大海龟啦啦啦 | 来源:发表于2020-08-17 14:39 被阅读0次

    view、TemplateView、RedirectView这三个类实现了创建Django类视图的大部分功能。可以将他们视为父视图,他们可以单独使用,也可以从中继承。可能它们无法提供项目所需的所有功能,在这种情况下,可以使用Mixins和Generic基于类的视图。

    一、View

    它来自于django.views.generic.base,可以用以下代码来导入

    from django.views.generic import View
    

    这是一个基本视图,其他的基于类的视图都是基于这个基本视图的。严格来说,它不是通用视图,因此也可以从django.views导入。

    from django.views import View
    

    View的方法

    1. 基于类的方法as_view(**initkwargs)
      返回一个可调用的视图,该视图接收请求并返回响应,当视图是请求/响应循环期间调用时, HttpRequest被分配到视图的request 属性。从URL模式捕获的任何位置和/或关键字参数分别分配给 argskwargs属性。然后dispatch()被调用。
    2. dispatch(request, *args, **kwargs)
      view视图的一部分 - 接受request 参数和参数的方法,并返回HTTP响应。
      默认实现将检查HTTP方法并尝试委托给与HTTP方法匹配的方法; a GET将被委派给get()a,POSTto post(),等等。
      默认情况下,HEAD将委派一个请求get()。如果您需要以HEAD不同的方式处理请求GET,则可以覆盖该head()方法。有关示例,请参阅 支持其他HTTP方法。
    3. http_method_not_allowed()
      如果使用不支持的HTTP方法调用视图,则会调用此方法。
    4. options()
      处理响应OPTIONS HTTP动词请求的句柄。返回Allow包含视图允许的HTTP方法名称列表的标头的响应。
    属性

    此视图将接受的HTTP方法名称列表。
    默认:['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

    示例:
    views.py

    from django.http import HttpResponse
    from django.views import View
     
    class MyView(View):
        def get(self, request, *args, **kwargs):
            return HttpResponse('Hello, World!')
    

    urls.py

    from django.urls import path
    from myapp.views import MyView
     
    urlpatterns = [
        path('mine/', MyView.as_view(), name='my-view'),
    ]
    

    二、TemplateView

    它也是来自于django.views.generic.base,可以用以下代码来导入

    from django.views.generic import TemplateView
    

    作用是呈现给定模板,其中包含在URL中捕获的参数的上下文。
    此视图继承的视图类

        django.views.generic.base.TemplateResponseMixin
        django.views.generic.base.ContextMixin
        django.views.generic.base.View
    

    TemplateView的方法

    1. dispatch()
    2. http_method_not_allowed()
    3. get_context_data()
      示例
      views.py
    from django.views.generic.base import TemplateView
    from articles.models import Article
    
    class HomePageView(TemplateView):
        template_name = "home.html"
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['latest_articles'] = Article.objects.all()[:5]
            return context
    

    urls.py

    from django.urls import path
    from myapp.views import HomePageView
     
    urlpatterns = [
        path('', HomePageView.as_view(), name='home'),
    ]
    

    三、RedirectView

    它也是来自于django.views.generic.base,可以用以下代码来导入

    from django.views.generic import RedirectView
    

    作用是重定向到给定的URL。
    给定的URL可能包含字典样式的字符串格式,该格式将根据URL中捕获的参数进行内插。 因为总是执行关键字插值(即使没有传递任何参数),所以URL中的任何“%”字符都必须写为“ %%”,以便Python将它们转换为输出时的单个百分号。如果给定的URL是None,django将会返回HttpResponseGone(410)
    此视图从以下视图继承方法和属性:

    django.views.generic.base.View
    

    RedirectView的方法

    1. dispatch()
    2. http_method_not_allowed()
    3. get_redirect_url()
    4. get_redirect_url(*args, **kwargs)构造用于重定向的目标URL。默认实现使用url作为起始字符串,并使用URL中捕获的命名组在该字符串中扩展%命名参数。如果未设置url,则get_redirect_url()尝试使用URL中捕获的内容反转pattern_name(使用命名和未命名组)。如果query_string请求,它将查询字符串附加到生成的URL。 子类可以实现其希望的任何行为,只要该方法返回可重定向的URL字符串即可。

    参数:
    url:要重定向的URL,以字符串形式。 或“None”引发410(Gone)HTTP错误。
    pattern_name:重定向到的URL模式的名称。 将使用与该视图相同的args和kwargs进行反转。
    permanent:重定向是否应该是永久的。 唯一的区别是返回的HTTP状态代码。 如果为True,则重定向将使用状态码301。如果为False,则重定向将使用状态码302。默认情况下,permanent值为False。
    query_string:是否将GET查询字符串传递到新位置。 如果为True,则查询字符串将附加到URL。 如果为False,则丢弃查询字符串。 默认情况下,query_string为False。
    示例
    views.py

    from django.shortcuts import get_object_or_404
    from django.views.generic.base import RedirectView
    from articles.models import Article
    
    class ArticleCounterRedirectView(RedirectView):
        permanent = False
        query_string = True
        pattern_name = 'article-detail'
        def get_redirect_url(self, *args, **kwargs):
            article = get_object_or_404(Article, pk=kwargs['pk'])
            article.update_counter()
            return super().get_redirect_url(*args, **kwargs)
    

    urls.py

    from django.urls import path
    from django.views.generic.base import RedirectView
    from article.views import ArticleCounterRedirectView, ArticleDetail
    
    urlpatterns = [
        path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'),
        path('details/<int:pk>/', ArticleDetail.as_view(), name='article-detail'),
        path('go-to-django/', RedirectView.as_view(url='https://djangoproject.com'), name='go-to-django'),
    ]
    

    参考django官方文档(https://www.h5w3.com/doc/django-docs-2.0-zh-hans/ref/class-based-views/base.html?highlight=view#django.views.generic.base.RedirectView.get_redirect_url

    相关文章

      网友评论

        本文标题:Django的基本视图(view、TemplateView、Re

        本文链接:https://www.haomeiwen.com/subject/scofjktx.html