开发环境:
python 3.6
django 1.11
场景一
经常有从数据库中获取一批数据,然后在前端以列表的形式展现,比如:获取到所有的用户,然后在用户列表页面展示。
解决方案
常规写法是,我们通过Django的ORM查询到所有的数据,然后展示出来,代码如下:
def user_list(request):
"""返回UserProfile中所有的用户"""
users = UserProfile.objects.all()
return render(request, 'talks/users_list.html', context={"user_list": users})
这样能够解决问题,但是Django针对这种常用场景,提供了一个更快速便捷的方式,那就是ListView
,用法如下:
from django.views.generic import ListView
class UsersView(ListView):
model = UserProfile
template_name = 'talks/users_list.html'
context_object_name = 'user_list'
这样我们就完成了上边功能,代码很简洁。
场景二:
我想要对数据做过滤,ListView
怎么实现?代码如下:
from django.views.generic import ListView
class UsersView(ListView):
model = UserProfile
template_name = 'talks/users_list.html'
context_object_name = 'user_list'
def get_queryset(self): # 重写get_queryset方法
# 获取所有is_deleted为False的用户,并且以时间倒序返回数据
return UserProfile.objects.filter(is_deleted=False).order_by('-create_time')
如果你要对数据做更多维度的过滤,比如:既要用户是某部门的,还只要获取到性别是男的,这时候,可以使用Django提供的Q函数来实现。
场景三
我想要返回给Template的数据需要多个,不仅仅是user_list
,可能还有其他数据,如获取当前登陆用户的详细信息,这时怎么操作?,代码如下:
from django.views.generic import ListView
class UsersView(ListView):
model = UserProfile
template_name = 'talks/users_list.html'
context_object_name = 'user_list'
def get_context_data(self, **kwargs): # 重写get_context_data方法
# 很关键,必须把原方法的结果拿到
context = super().get_context_data(**kwargs)
username = self.request.GET.get('user', None)
context['user'] = UserProfile.objects.get(username=username
return context
这样,你返回给Template页面时,context包含为{'user_list': user_list, 'user': user}
。
场景四
我想要限制接口的请求方式,比如限制只能GET访问,代码如下:
from django.views.generic import ListView
class UsersView(ListView):
model = UserProfile
template_name = 'talks/users_list.html'
context_object_name = 'user_list'
http_method_names = ['GET'] # 加上这一行,告知允许那种请求方式
场景五
我卡卡卡的返回了所有的数据给前端页面,前页面最好得分页展示呀,这怎么搞?请看代码:
from django.views.generic import ListView
class UsersView(ListView):
model = UserProfile
template_name = 'talks/users_list.html'
context_object_name = 'user_list'
paginate_by = 12 # 只需加上这一行,12表示每页内容显示多少个
Template页面怎么用呢?来,上代码:
<center>
{% if page_obj %}
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a class="btn btn-primary" href="?page=1">第一页</a>
<a class="btn btn-primary" href="?page={
{ page_obj.previous_page_number }}">上一页</a>
{% endif %}
<a class="btn btn-default">
Page {
{ page_obj.number }} of {
{ page_obj.paginator.num_pages }}.
</a>
{% if page_obj.has_next %}
<a class="btn btn-primary" href="?page={
{ page_obj.next_page_number }}">下一页</a>
<a class="btn btn-primary" href="?page={
{ page_obj.paginator.num_pages }}">最后一页</a>
{% endif %}
</span>
</div>
{% endif %}
</center>
或者(补充例子) :
{% extends "base2.jinja.html" %}
{% set active_page = 'serverlist' -%}
{% block body %}
<form class="form-inline" role="form" action="" method="GET">
<div class="panel panel-default">
<div class="panel-heading">
<div class="form-group">
<select name="plat" class="form-control">
<option value="">--全部--</option>
{% for i in platlist -%}
<option value="{
{ i.plat }}" {% if request.GET.plat == i.plat -%}selected{% endif -%}>{
{ i.plat }}</option>
{% endfor -%}
</select>
</div>
<div class="form-group">
<input type="input" name="keyword" class="form-control" placeholder="请输入域名或者IP" value="{
{ request.GET.keyword }}">
</div>
<button type="submit" class="btn btn-primary">Search</button>
</div>
<table class="table table-striped table-bordered table-hover table-condensed">
<thead>
<tr>
<th>平台</th>
<th>服务器名称</th>
<th>合服列表</th>
<th>开服时间</th>
<th>域名/IP</th>
<th></th>
</tr>
</thead>
<tbody>
{% for server in serverlist -%}
<tr>
<td>{
{ server.plat }}</td>
<td>{
{ server.server_id }}服-{
{ server.server_name }}</td>
<td>{
{ server.hefu_range.replace('-',',').strip() }}</td>
<td>{
{ server.open_time }}</td>
<td>
{
{ server.domain }}<br>
{
{ server.dx_ip }}/{
{ server.lt_ip }}
</td>
<th><a href="#" class="btn btn-primary" role="button">执行命令</a></th>
</tr>
{% endfor -%}
</tbody>
</table>
</div>
<div class="panel-default">
<center>
<ul class="pagination">
<li><a href="{
{ request.path }}?plat={
{ request.GET.plat }}&keyword={
{ request.GET.keyword }}&page=1">«</a></li>
{% if page_obj.has_previous() %}
<li><a href="{
{ request.path }}?plat={
{ request.GET.plat }}&keyword={
{ request.GET.keyword }}&page={
{ page_obj.previous_page_number() }}">上一页</a></li>
{% else %}
<li class="previous disabled"><a>上一页</a></li>
{% endif %}
{% for i in page_obj.paginator.page_range %}
<li {% if page_obj.number == i %}class="active"{% endif %}><a href="{
{ request.path }}?plat={
{ request.GET.plat }}&keyword={
{ request.GET.keyword }}&page={
{ i }}">{
{ i }}</a></li>
{% endfor %}
{% if page_obj.has_next() %}
<li><a href="{
{ request.path }}?plat={
{ request.GET.plat }}&keyword={
{ request.GET.keyword }}&page={
{ page_obj.next_page_number() }}">下一页</a></li>
{% else %}
<li class="previous disabled"><a>下一页</a></li>
{% endif %}
<li><a href="{
{ request.path }}?plat={
{ request.GET.plat }}&keyword={
{ request.GET.keyword }}&page={
{ page_obj.paginator.num_pages }}">»</a></li>
</ul>
</center>
</div>
</form>
{% endblock %}
转载自,有补全增加场景五内容: