django generic view - ListView


 ListView (帶分頁)

1.帶分頁效果的基礎模板

1) view

from django.views.generic.list import ListView

from employ.models import Company


class CompanyListView(ListView):
    model = Company
    context_object_name = "companies"
    template_name = 'company/company_list.html'
    paginate_by = 20

2) url

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.CompanyListView.as_view(), name='company-list'),

]

3) template

<table class="table table-striped">
    <thead>
        <tr>
            <th>名稱</th>
            <th>規模</th>
        </tr>
    </thead>
    <tbody>
        {% for company in companies %}
        <tr>
            <td>{{ company.name }}</td>
            <td>{{ company.scale }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>

{% if is_paginated %}
<div class="pagination center-block">
    <span>共{{ page_obj.paginator.num_pages }}頁</span>
    <span id="paging" class="step-links" style="display: block;text-align: center">
        {% if page_obj.has_previous %}
        <span><a href="?page={{ page_obj.previous_page_number }}">上一頁</a></span>
        {% endif %}
        <span class="active">{{ page_obj.number }}</span>
        {% if page_obj.has_next %}
        <span><a href="?page={{ page_obj.next_page_number }}">下一頁</a></span>
        {% endif %}
    </span>
</div>
{% endif %}

 

2.model < queryset < get_queryset()

這時候,頁面上顯示是model里的所有對象。如果我們希望這個object list排序后呈現呢?或者想要篩選部分呈現?這些又在哪定義呢?

很簡單,這時候只要定義queryset或者重寫get_queryset()方法就能搞定。

注意:model、queryset、get_queryset()至少要定義一個。而當三個都定義的時候,get_queryset()的效果強於queryset,而queryset的效果又強於model。

2.1 定義queryset

from django.views.generic.list import ListView

from employ.models import Company


class CompanyListView(ListView):
    context_object_name = "companies"
    template_name = 'company/company_list.html'
    paginate_by = 20
    queryset = Company.objects.all().order_by('-scale')   

 

2.2 重寫get_queryset()

from django.views.generic.list import ListView

from employ.models import Company


class CompanyListView(ListView):
    context_object_name = "companies"
    template_name = 'company/company_list.html'
    paginate_by = 20
def get_queryset(self): companies = Company.objects.all().order_by('-scale') return companies

 

3.向template傳遞額外信息

以上,我們只向template中傳遞了關於某個Model里的所有對象。那么,我們有什么方法傳遞更多信息呢?

方法一:重寫get_context_data()。如我想傳遞當前時間顯示在template中:

view:

from django.views.generic.list import ListView

from employ.models import Company

from datetime import datetime


class CompanyListView(ListView):
    context_object_name = "companies"
    template_name = 'company/company_list.html'
    paginate_by = 20
    queryset = Company.objects.all().order_by('-open_positions')

    def get_context_data(self, **kwargs):
        context = super(CompanyListView, self).get_context_data(**kwargs)
        context['now'] = datetime.now()
        return context

template:

{{ now }}

 

方法二:在view中定義some_method()方法返回數據,在模版中使用{{ view.some_method }}。

注意:some_method(self)方法只能有一個self參數。

view:

from django.views.generic.list import ListView

from employ.models import Company

from datetime import datetime


class CompanyListView(ListView):
    context_object_name = "companies"
    template_name = 'company/company_list.html'
    paginate_by = 20
    queryset = Company.objects.all().order_by('-open_positions')

    def now(self):
        return datetime.now()

template:

{{ view.now }}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM