Django04-view

本文介绍如何使用Django框架实现用户列表展示及用户详情查看功能,包括视图设计、URL配置及模板使用,并进一步探讨如何利用Django的通用视图简化开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


根据之前数据库中实体的关系,我们相应建立几个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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值