2012-03-23 21 views
6

Tôi đã đọc một số hướng dẫn và sách về generic views.Để sử dụng trong Django: ListView hoặc list_detail?

Trong part 4 of the official tutorial, họ đã viết một ví dụ như thế này

from django.conf.urls import patterns, include, url 
from django.views.generic import DetailView, ListView 
from polls.models import Poll 

urlpatterns = patterns('', 
    url(r'^$', 
     ListView.as_view(
      queryset=Poll.objects.order_by('-pub_date')[:5], 
      context_object_name='latest_poll_list', 
      template_name='polls/index.html')), 
    url(r'^(?P<pk>\d+)/$', 
     DetailView.as_view(
      model=Poll, 
      template_name='polls/detail.html')), 
    url(r'^(?P<pk>\d+)/results/$', 
     DetailView.as_view(
      model=Poll, 
      template_name='polls/results.html'), 
     name='poll_results'), 
    url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'), 
) 

Tôi cũng đã được đọc The Definitive Guide to Django: Web Development Done Right, Second Edition và khi họ nói về quan điểm chung, họ đã viết tấm gương của họ như thế này

from django.conf.urls.defaults import * 
from django.views.generic import list_detail 
from mysite.books.models import Publisher 

publisher_info = { 
    'queryset': Publisher.objects.all(), 
    'template_name': 'publisher_list_page.html', 
} 

urlpatterns = patterns('', 
    (r'^publishers/$', list_detail.object_list, publisher_info) 
) 

Tôi có nên được sử dụng ListView hoặc list_detail? Cả hai đều đến từ django.views.generic. Nếu cả hai có thể được sử dụng, thì sự khác biệt (lợi thế và so sánh bất lợi) là gì?

Trong trường hợp giúp, tôi sẽ giải thích mục tiêu của mình: Trong dự án của tôi, tôi muốn liệt kê các đơn đặt hàng công việc, và sau đó tôi muốn xem chi tiết mỗi đơn đặt hàng công việc. tương tự như bình luận cho mỗi bài đăng trên blog).

Trả lời

10

ListView (dựa trên lớp) nhằm thay thế object_list (dựa trên chức năng) vì có sự linh hoạt hạn chế để mở rộng hành vi của hàm.

Django (1.4) documentation notes, chế độ xem chung dựa trên chức năng không còn được dùng để ủng hộ các phiên bản dựa trên lớp học. Vì vậy, hãy sử dụng ListView, vì Django đã xóa object_list.

Dù bằng cách nào, tôi thích đặt tất cả các tùy chỉnh trong views.py để tránh làm lộn xộn lên urls.py, điều này có xu hướng là nền tảng bán phá giá của mọi thứ.

+1

Tôi thực sự không hiểu tài liệu chế độ xem chung dựa trên Lớp học. Ví dụ, đối với ['ListView'] (https://docs.djangoproject.com/en/dev/ref/class-based-views/#list-views), tại sao mục nhập lại quá ngắn? Tôi có thể tìm danh sách tất cả các phương pháp và biến số ở đâu? – hobbes3

+4

Thật không may, đó là một phần của tài liệu xấu trên một phần của Django (một phần vì đa thừa kế). Nhưng bạn có thể xem những gì họ phân lớp: ví dụ: - https://docs.djangoproject.com/en/dev/ref/class-based-views/#django.views.generic.list.MultipleObjectMixin – Jeff

12

Tôi đang tìm Classy hữu ích như là một cách dễ dàng để xem một phác thảo của mỗi CBV: http://ccbv.co.uk/projects/Django/1.6/django.views.generic.list/ListView/

Nó cảm thấy như một phần còn thiếu của các tài liệu Django bây giờ.

+3

Đây không phải là câu trả lời được chấp nhận, nhưng tài nguyên này thật tuyệt vời. – edhedges

+0

Thật không may, liên kết xuất hiện bị hỏng: ( – moooeeeep

+0

Chỉ cần kiểm tra và URL vẫn hoạt động đối với tôi - Tôi sử dụng hầu hết các ngày đó. Đã chỉnh sửa nhận xét bao gồm Dj 1.6. – trojjer

Các vấn đề liên quan