2012-03-01 22 views
6

Theo một trong các ý kiến ​​trong https://stackoverflow.com/a/8715790/210481, mà tôi đồng ý với, chúng ta nên tránh nhiều trang trí nếu một phụ thuộc vào khác.Django: tái sử dụng decor_required trang trí bên trong trang trí khác

Vì vậy, trong ví dụ, nếu chúng tôi có trang trí "active_required" cho người dùng đang hoạt động, chúng tôi không phải sử dụng cả active_required và login_required trên cùng một chế độ xem.

Chúng ta phải có trang trí "login_required" được gọi là "bằng cách nào đó bên trong" active_required ".

Có thể làm điều đó bằng trình trang trí "login_required" chuẩn đi kèm với django không?

yêu cầu của tôi là: 1) nếu người dùng không xác thực, tôi nên chuyển hướng anh LOGIN_URL 2) nếu người dùng được xác thực (thông qua login_required), nhưng không hoạt động, tôi nên chuyển hướng anh đến một trang để "tái kích hoạt" tài khoản của mình 3) nếu người dùng được xác thực và hoạt động, người dùng có thể truy cập vào xem

Cảm ơn trước

+0

vì bạn muốn các hành vi khác nhau trong 3 trường hợp có thể có hai trang trí có vẻ tốt – second

+0

Như tôi understard bạn muốn sử dụng chỉ có một trang trí thay vì hai mà không hai xét nghiệm khác nhau? – sergzach

+0

Tôi muốn 2 hành vi khác nhau nhưng một phụ thuộc nhất thiết vào hành vi khác. @ChrisPratt, tôi đã xem xét nhận xét của bạn, khi tôi nghĩ về điều này. Chức năng đăng nhập chuẩn không kiểm tra cờ "hoạt động", chỉ khi kết hợp tên người dùng và mật khẩu. Tôi có thể nghĩ về các ví dụ khác: Trong trang web của tôi, người dùng có thể tạo danh sách và chỉ chủ sở hữu danh sách mới có thể chỉnh sửa danh sách, vì vậy tôi cần kiểm tra xem người dùng đã đăng nhập chưa và đó có phải là chủ sở hữu của danh sách hay không. Đây chỉ là một ví dụ khác. – duduklein

Trả lời

8

Khi suy nghĩ về câu hỏi của bạn, tôi thấy nó dễ dàng hơn để tạo ra một đơn giản active_required trang trí đầu tiên. Điều này rất dễ dàng, bởi vì chúng ta có thể sử dụng hàm user_passes_test trong django.contrib.auth.decorators.

Câu hỏi sau đó thay đổi thành "làm cách nào để kết hợp login_requiredactive_required vào một trang trí?". Chúng ta cần phải xác định một chức năng đó:

  1. mất một chức năng xem như đó là lập luận
  2. áp dụng cho cả trang trí với nó để tạo ra một chức năng xem mới
  3. lợi nhuận quan điểm chức năng mới

Đưa tất cả cùng nhau, bạn có những điều sau đây:

from django.contrib.auth.decorators import user_passes_test, login_required 

active_required = user_passes_test(lambda u: u.is_active, login_url=REACTIVATE_URL) 

def active_and_login_required(view_func): 
    decorated_view_func = login_required(active_required(view_func)) 
    return decorated_view_func 
Các vấn đề liên quan