2012-04-26 35 views
7

Tình hình khá đơn giản: Tôi đang viết hệ thống blog nhiều người dùng. Hệ thống sẽ ngăn không phải chủ sở hữu chỉnh sửa hoặc xóa bài đăng trên blog. Theo quan điểm của tôi, tôi sử dụng chế độ xem chung.Thêm mức quyền đối tượng vào chế độ xem chung

lớp BlogUpdateView (UpdateView): ...

Tôi biết tôi nên sử dụng để trang trí @method_decorator phương pháp công văn. Tuy nhiên, hầu hết các ví dụ chỉ là @method_decorator (login_required) hoặc cấp phép mô hình. Làm thế nào có thể áp dụng quyền đối tượng cấp để kiểm tra xem request.user là tác giả của bài đăng blog này? Ví dụ, tôi đã cố gắng sử dụng các ứng dụng django-authority, và tôi có một lớp BlogPermission trong tệp này. và tôi đã cố gắng xác định một phương thức trong lớp này, ví dụ:

def blog_edit(self, ??, ??)

tôi nên đưa vào phương pháp này như thế nào?

Và sau đó gọi này như: @method_decorator(permission_required('blog_permission.blog_edit(???)'))

tôi nên vượt qua gì ở đây?

Cập nhật: Sau khi đọc mã phương thức_decorator, tôi thấy nó chỉ có thể chấp nhận hàm không có đối số. Tôi nghĩ đó là lý do tại sao permission_required không hoạt động ở đây. Nhưng công việc xung quanh về điều này là gì?

giải pháp Cập nhật:

Trong phương pháp văn, tôi kiểm tra sự cho phép người sử dụng và sau đó trở về HttpResponseForbidden() nếu người dùng không đáp ứng được sự cho phép.

+0

Bạn có thể kiểm tra quyền của bạn trong 'phương pháp get_object'. Trang trí trông không tốt với CBV. – ilvar

+0

vì vậy bạn có nghĩa là không có cách nào dễ dàng để áp dụng trang trí cấp đối tượng vào chế độ xem chung dựa trên Lớp học? @ilvar – Xinghan

+0

Tôi có nghĩa là nó sẽ được dễ dàng hơn để làm trong 'get_object'. Để làm cho nó thêm DRY, bạn có thể tạo một Mixin với 'get_object' và sử dụng nó. – ilvar

Trả lời

11

Bạn có thể làm điều đó bằng đẳng cấp dựa-views:

class BlogEdit(UpdateView): 
    model = Blog 

    def dispatch(self, request, *args, **kwargs): 
     if not request.user.has_perm('blog_permission.blog_edit'): 
      return HttpResponseForbidden() 
     return super(BlogEdit, self).dispatch(request, *args, **kwargs) 

    # OR (for object-level perms) 

    def get_object(self, *args, **kwargs): 
     obj = super(BlogEdit, self).get_object(*args, **kwargs) 
     if not obj.user == self.request.user: 
      raise Http404 # maybe you'll need to write a middleware to catch 403's same way 
     return obj 
+2

Ngoại lệ tích hợp 'django.core.exceptions.PermissionDenied' có thể được nâng lên để hiển thị trang lỗi 403 từ' get_object'. Sau đó, bạn có thể tùy chỉnh lỗi trong mẫu '403.html' hoặc ghi đè chế độ xem bằng' handler403' trong URLconf (xem https://docs.djangoproject.com/en/1.7/topics/http/views/#customizing -xuất sắc). Rất tiếc, bạn không thể chuyển thông báo qua ngoại lệ và ngữ cảnh mẫu không được gửi ngoại lệ thô thông qua hành vi được tích hợp sẵn. Nếu bạn muốn hiển thị một thông điệp đặc biệt, bạn sẽ cần phải tạo phần mềm trung gian. – jcampbelly

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