根据之前数据库中实体的关系,我们相应建立几个view
/points 首页,显示不用模板的用户列表
/points/help 帮助页,显示不用模板的固定返回值
/points/notice 通知页,显示使用模板的用户列表
/points/notice/<user_id> 通知详情页,显示使用模板的用户积分列表
urls.py
from django.conf.urls import url
from . import views
app_name="points" # 和html中:前的名称匹配
urlpatterns=[
url(r'^$',views.index,name='index'),
# /points/help
url(r'^help/$',views.help,name='help'),
# /points/notice
url(r'^notice/$',views.notice,name='notice'),
url(r'^notice/(?P<user_id>[0-9]+)$',views.detail,name='detail'),
]
views.py
from django.shortcuts import render,get_object_or_404
from django.http import HttpResponse
from django.http import Http404
from django.template import loader
from .models import User
# Create your views here.
def index(request):
user_list=User.objects.order_by('-join_date')[:5]
output=', '.join([u.username for u in user_list])
return HttpResponse(output)
def help(request):
return HttpResponse("this is the help page")
def notice(request):
user_list=User.objects.order_by('-join_date')[:5]
context={'user_list':user_list}
return render(request,'points/notice.html',context) # 简写方式
# user_list=User.objects.order_by('-join_date')[:5]
# template=loader.get_template('points/notice.html')
# context={
# 'user_list':user_list
# }
# return HttpResponse(template.render(context,request))
def detail(request,user_id):
user=get_object_or_404(User,pk=user_id) # 直接使用get_object_or_404来处理,调用get()
return render(request,'points/detail.html',{'user':user}) # 简写方式
# try:
# user=User.objects.get(pk=user_id)
# except User.DoesNotExist:
# raise Http404("User does not exist")
# return render(request,'points/detail.html',{'user':user})
在PointsPlus这个app下创建目录templates/,在其下创建目录points/,这里新建notice.html和detail.html两个文件
notice.html
{% if user_list %}
<ul>
{% for user in user_list %}
<li><a href="{% url 'points:detail' user.id %}">{{ user.username }}</a></li> <!--这里使用的points就是我们在urls.py中定义的app_name-->
<li><a href="/points/notice/{{ user.id }}">{{ user.username }}</a></li> <!--硬编码-->
{% endfor %}
</ul>
{% else %}
<p>No PointsPlus are available.</p>
{% endif %}
detail.html
<h1>{{ user.username }}</h1>
<ul>
{% for point in user.points_set.all %}
<li>{{ point.value }}:{{point.deriver}}</li>
{% endfor %}
</ul>
使用Django的generic views
这里使用ListView和DetailView两种generic views,他们一般用于显示对象列表和某一类对象的详细信息
每一种generic view都需要知道使用的是什么模型,就必须提供model这个属性
DetailView预期从URL中得到名为pk的主键值,之前使用的user_id需要改为pk。
默认情况下DetailView使用名为<app name>/<model name>_detail.html的模板,在这里就是PointsPlus/user_detail.html。如果指定template_name属性,Django就会使用特定的模板名称。
对于DetailView,因为我们使用了模型User,user变量是自动提供的。Django能为上下文变量决定一个合适的名字。在ListView中,自动生成的上下文变量名为user_list,可以提供context_object_name属性来重载。
urls.py
# url(r'^notice/$',views.notice,name='notice'),
url(r'^notice/$',views.NoticeView.as_view(),name='notice'),
# url(r'^notice/(?P<user_id>[0-9]+)$',views.detail,name='detail'),
url(r'^notice/(?P<pk>[0-9]+)$',views.DetailView.as_view(),name='detail'),
views.py
class NoticeView(generic.ListView):
template_name='points/notice.html'
context_object_name='user_list'
def get_queryset(self):
return User.objects.order_by('-join_date')[:5]
class DetailView(generic.DetailView):
model=User
template_name="points/detail.html"
参考链接:
https://docs.djangoproject.com/en/1.11/intro/tutorial03/
https://docs.djangoproject.com/en/1.11/intro/tutorial04/
http://python.usyiyi.cn/translate/django_182/ref/class-based-views/generic-display.html