django

django视图view

2018-08-19  本文已影响82人  陆_志东

django的视图有两种,一种function式,一种式class
setting文件里面的ROOT_URLCONF设置了路由匹配的主url文件

编写第一个视图

polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

然后在应用下的url文件注册url匹配

polls/urls.py
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

在项目主url文件里面分配url到应用

mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', include(admin.site.urls)),
]

利用正则匹配url来获取参数

--视图编写定义形参polls/views.py
def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)

def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)


--polls/urls.py通过正则分组来获取参数
from django.conf.urls import url

from . import views

urlpatterns = [
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

注意:在分组内也可以不用定义变量的名字,形参按顺序接收,如果定义了名字,必须名字对应接收

渲染django模板的低版本模式

from django.http import HttpResponse
from django.template import RequestContext, loader

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = RequestContext(request, {
        'latest_question_list': latest_question_list,
    })
    return HttpResponse(template.render(context))

使用render方式渲染模板

polls/views.py
from django.shortcuts import render

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

--模板语言使用{{}}包括
polls/templates/polls/detail.html
{{ question }}

引发404错误的低级方式

polls/views.py
from django.http import Http404
from django.shortcuts import render

from .models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})

引发404错误的高级方式get_object_or_404

polls/views.py
from django.shortcuts import get_object_or_404, render

from .models import Question
# ...
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

处理模板语言中的url连接指向

原始方法可维护性太差

<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

使用反向解析需要使用name

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
--需要在当前app下的url文件里面的路由规则定义name属性 name=detail
--url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail')
--这样模板语言就会自动填充url,并且将参数question.id 传送到url里面

渲染到其他app下的url需要使用命名空间namespace

在主路由url文件下添加namespace属性
mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls', namespace="polls")),
    url(r'^admin/', include(admin.site.urls)),
]


在app下的url文件里面添加name属性
mysite/urls.py
url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail')

修改模板语言为
polls/templates/polls/index.html
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
上一篇下一篇

猜你喜欢

热点阅读