Django Tutorial Part3

1)first view:(index)
A.polls/views.py:

from django.http import HttpResponse

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

B.要调用view,需要将其映射到url
创建polls/urls.py(创建URLconf):

from django.conf.urls import url
from . import views

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

C.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)),
]

D.got to http://localhost:8000/polls/
这里写图片描述
2)url() function
两个必传参数:regex,view
两个可选参数:kwargs,name
A.regex正则表达式
将请求的url和每个正则表达式进行比较,匹配到了就转到对应的view
正则表达式在第一次加载polls/urls.py时被编译
B.view
当Django找到一个正则表达式匹配时,Django会调用指定的视图函数
C.kwargs(keyword arguments关键词参数)
D.name

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

3)more views
A.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)

B.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'),
]

C.go to http://localhost:8000/polls/1/
运行detail()
这里写图片描述
go to http://localhost:8000/polls/1/results
运行results()
这里写图片描述
go to http://localhost:8000/polls/1/vote
运行vote()
这里写图片描述
4)显示系统中最新的5个poll question
polls/views.py:

from django.http import HttpResponse
from .models import Question

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ', '.join([p.question_text for p in latest_question_list])
    return HttpResponse(output)

# Leave the rest of the views (detail, results, vote) unchanged

这里写图片描述
5)创建polls/templates/polls/index.html
A.polls/templates/polls/index.html:

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

B.修改polls/views.py :
法一:

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))

法二:

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)

上面render() function三个参数:
必传参数:
1.request
2.template name(’polls/index.html’)
可选参数:
3.dictionary
C.go to http://localhost:8000/polls/
这里写图片描述
6)当question不存在的时候引发not found 404异常
A.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})

上面代码比较简单的写法是
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})

在get_object_or_404 function里面有try,catch

def get_object_or_404(klass, *args, **kwargs):

    queryset = _get_queryset(klass)
    try:
        return queryset.get(*args, **kwargs)
    except queryset.model.DoesNotExist:
        raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)

B.polls/templates/polls/detail.html:

{{ question }}

C.go to http://localhost:8000/polls/3/
访问不存在的question:
这里写图片描述
D.get_list_or_404()和get_object_or_404()不同如下:
这里写图片描述
get()换为filter()
7)修改polls/templates/polls/detail.html实现detail view显示question_text和其所有的choice_text
polls/templates/polls/detail.html:

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

这里写图片描述
8)remove hardcoded URLs in templates
polls/index.html :
将下面代码

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

改为:

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

9)当一个project里面有多个application时,让mysite/urls.py的url指向对应的application
A.在mysite/urls.py里添加namespace:

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)),
]

B.修改polls/templates/polls/index.html:

<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值