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>