17.Django视图二

通过第一阶段的学习,相信大家已经了解Django的基本知识,接下来我们 进入下一阶段的学习。

1.返回Http状态码

from django.http import HttpResponse, HttpResponseNotFound

def index(request):
    # status 返回响应状态码 比如404 405 500 302等等
    return HttpResponse(status=500, content='<h2>页面找到</h2>')

控制台将会输出

"GET / HTTP/1.1" 500 21

内置响应: HttpResponseNotFound:404

2.自定义错误视图

修改views.py

# *args, **kwarg必须有 不然会报500的错误
def my_custom_page_not_found_view(request,*args, **kwargs):
    return HttpResponse('自定义  404')

在urls.py修改

from django.conf.urls import (handler400, handler404,
            handler403, handler500)

from advance.views import index, my_custom_page_not_found_view

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
]

# 定义自定义404
handler404 = my_custom_page_not_found_view
  • 400:bad_request
  • 403: permission_denied
  • 404: not found
  • 500: server_error

3.装饰视图

修改views.py

from django.views.decorators.http import require_http_methods

# 支持get post
@require_http_methods(['GET', 'POST'])
def index(request):
    return HttpResponse('success')
  • require_http_methods:设置支持的方法
  • require_GET:只支持get
  • require_POST:支持post
  • require_safe:支持GET and HEAD
    其他
  • condition
  • etag
  • last_modified
  • gzip_page
  • vary_on_cookie
  • vary_on_headers
  • cache_control 缓存控制
  • never_cache

4.便捷函数

  • render()

    render(request, template_name, context=None, content_type=None, status=None, using=None)
    

    必选参数:
    request
    templates_name
    可选参数:
    context:上下文需要的参数,使用在模板中
    content_type:mime类型,设置:setting:DEFAULT_CONTENT_TYPE 设置的值
    status:状态码
    using: 模板加载引擎 setting:NAME设置

  • redirect() 转发
    redirect(to, permanent=False, *args, **kwargs)

    redirect('other.html')
  • get_object_or_404() 自动判断查询的数据是否存在
    get_object_or_404(klass, *args, **kwargs)
from django.shortcuts import get_object_or_404

def index(request):
    # 查询id为1的User
    user = get_object_or_404(User, pk=1)
    return HttpResponse('success')
  • get_list_or_404() 查询列表,同get_object_or_404()
    get_list_or_404(klass, *args, **kwargs)
from django.shortcuts import get_list_or_404

def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

5.改良视图-基于类的视图

前面我们都使用函数视图,其实Django也支持class视图

重写方法提供参数

from django.views import generic
class IndexView(generic.ListView):
    template_name = 'index.html'

    def get_context_data(self, *, object_list=None, **kwargs):
        pass

    def get_queryset(self):
        return User.objects.order_by('pub_date')

    def get_paginate_by(self, queryset):
        pass


class DetilView(generic.DateDetailView):
    model = UserWarning
    template_name = 'detail.html'

urls.py

from advance.views import IndexView
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', IndexView.as_view(), name='index'),
]
声明:原创文章,版权所有,转载请注明出处,https://litets.com。