django-原理-shortcut functions
写views
参考:
https://docs.djangoproject.com/en/1.10/topics/http/shortcuts/#render-to-response
view是python函数,返回response
response可以包含HTML、重定向、404、xml、图片...
一个简单的view
from django.http import HttpResponse
import datetime
def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
映射url到views
URL dispatcher
返回erros
关于request和response的子类,参考:
https://docs.djangoproject.com/en/1.10/ref/request-response/#ref-httpresponse-subclasses
from django.http import HttpResponse, HttpResponseNotFound
def my_view(request):
    # ...
    if foo:
        return HttpResponseNotFound('<h1>Page not found</h1>')
    else:
        return HttpResponse('<h1>Page was found</h1>')
也可以在HttpResponse构造函数中添加返回值
from django.http import HttpResponse
def my_view(request):
    # ...
    # Return a "created" (201) response code.
    return HttpResponse(status=201)
因为404比较普遍,所以提供了专门的类
Http404
如果返回类似HttpResponseNotFound的页面,可以定义html返回
return HttpResponseNotFound('<h1>Page not found</h1>')
django会捕获404异常,并且返回标准的404页
from django.http import Http404
from django.shortcuts import render
from polls.models import Poll
def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404("Poll does not exist")
    return render(request, 'polls/detail.html', {'poll': p})
可以创建一个404.html模板,并且把它放置在template tree的最顶层;
如果在debug模式,会返回标准的debug404
定制错误views
可以用handler404覆盖page_not_found()
handler404 = 'mysite.views.my_custom_page_not_found_view'
server_error()被handler500覆盖
handler500 = 'mysite.views.my_custom_error_view'
permission_denied()被handler403覆盖
handler403 = 'mysite.views.my_custom_permission_denied_view'
bad_request()被handler400覆盖
handler400 = 'mysite.views.my_custom_bad_request_view'
CSRF错误可以用CSRF_FAILURE_VIEW设置;
shortcut函数
render()
render(request, template_name, context=None, content_type=None, status=None, using=None)
渲染模板,返回HttpResponse对象
必要参数:request,template_name
额外参数
context			默认是个空词典,如果能被调用,会在模板加载前调用
content_type	用来返回document的MIME类型,默认是DEFAULT_CONTENT_TYPE设置
status			默认200
using			模板引擎
例子:
from django.shortcuts import render
def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {
        'foo': 'bar',
    }, content_type='application/xhtml+xml')
from django.http import HttpResponse
from django.template import loader
def my_view(request):
    # View code here...
    t = loader.get_template('myapp/index.html')
    c = {'foo': 'bar'}
    return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')
render_to_response()
弃用
redirect()
redirect(to, permanent=False, *args, **kwargs)
返回HttpResponseRedirect
这样参数会
- 调用get_absolute_url()
- reverse() 重新解析name
- URL重定向
 permanent=True返回永重构定向, permanent=false返回临时重定向;
有多重方法可以使用redirect()
get_absolute_url() 方法会解析到重定向的url
from django.shortcuts import redirect
def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)
可以通过reverse解析
def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')
解析到的url标准url解析
def my_view(request):
    ...
    return redirect('/some/url/')
也可用在全url
def my_view(request):
    ...
    return redirect('https://example.com/')
get_object_or_404()
get_object_or_404(klass, *args, **kwargs)
调用在模型管理器上调用get()会跑出Http404 ,而不是DoesNotExist异常
klass		Module类、Manager或者QuerySet
**kwargs	查找参数
from django.shortcuts import get_object_or_404
def my_view(request):
    my_object = get_object_or_404(MyModel, pk=1)
例子相当于
from django.http import Http404
def my_view(request):
    try:
        my_object = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")
传递QuerySet例子:
queryset = Book.objects.filter(title__startswith='M')
get_object_or_404(queryset, pk=1)
这个例子相当于
get_object_or_404(Book, title__startswith='M', pk=1)
使用 related managers
author = Author.objects.get(name='Roald Dahl')
get_object_or_404(author.book_set, title='Matilda')
get_list_or_404()
get_list_or_404(klass, *args, **kwargs)
参数
klass		 Model, Manager or QuerySet获取list用
**kwargs	 get() and filter()
from django.shortcuts import get_list_or_404
def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)
这个例子相当于
from django.http import Http404
def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404("No MyModel matches the given query.")
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号