2012-08-26 32 views
5

Tôi đang viết chế độ xem được kế thừa từ ListView và đang cố giới hạn chế độ xem cho người dùng đã đăng nhập.Sự khác biệt giữa hai phương pháp trang trí các chế độ xem dựa trên lớp học là gì?

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconf nói rằng trang trí với login_required trong URLconf "áp dụng trang trí trên cơ sở mỗi trường hợp. Nếu bạn muốn mọi trường hợp của một lần xem được trang trí, bạn cần phải thực hiện một cách tiếp cận khác" phương thức công văn trong mã xem.

Tôi nghĩ rằng tôi biết sự khác biệt giữa một lớp và một thể hiện nhưng cụm từ này không có ý nghĩa gì với tôi. Ai đó có thể làm rõ? Ngoài việc có một trang trí trong URLconf trái ngược với định nghĩa lớp học của bạn, sự khác biệt giữa hai cách tiếp cận là gì?

Đoạn trên liên kết đó dường như trả lời câu hỏi: "Vì chế độ xem dựa trên lớp học không hoạt động, trang trí chúng hoạt động khác nhau tùy thuộc vào việc bạn đang sử dụng as_view hoặc tạo lớp con".

Thật sao ?? Tôi dường như có thể sử dụng cách tiếp cận URLconf với lớp con của ListView của tôi.

Trả lời

5

Hãy tưởng tượng bạn có lớp view dựa sau:

class PostListView(ListView): 
    model = Post 

ProtectedPostListView = login_required(PostListView.as_view()) 

và urls.py của bạn:

url(r'posts$', ProtectedPostListView) 

Nếu bạn sử dụng phương pháp này sau đó bạn mất khả năng phân lớp ProtectedPostListView ví dụ

class MyNewView(ProtectedPostListView): 
    #IMPOSSIBLE 

và điều này là do .as_view() trả về một hàm và sau khi áp dụng trang trí login_required, bạn được để lại một hàm, do đó không thể phân lớp phụ.

Mặt khác, nếu bạn đi với cách tiếp cận thứ hai, tức là sử dụng trình trang trí phương thức, lớp con có thể thực hiện được. ví dụ:

class PostListView(ListView): 
    model = Post 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PostListView, self).dispatch(*args, **kwargs) 

class MyNewView(PostListView): 
    #LEGAL 
Các vấn đề liên quan