Django的ListView超详细用法(含分页paginate功能),文章有增加内容

开发环境:

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 %}

转载自,有补全增加场景五内容:

https://www.cnblogs.com/bigyoung/p/12925786.html

https://bigyoung.cn/posts/73/

https://my.oschina.net/u/2260265/blog/414175

猜你喜欢

转载自blog.csdn.net/HD243608836/article/details/107182567
今日推荐