2010-11-03 39 views
21

Tôi biết câu hỏi này nghe có vẻ lạ, nhưng xin vui lòng, hãy để tôi giải thích bản thân mình.Django: Xóa tin nhắn trước khi chúng được hiển thị

Tôi đang sử dụng trình trang trí để làm cho thư tồn tại cho đến khi người dùng thực sự loại bỏ thông báo đó (giống như hành vi của các thư bị tràn của ngăn xếp). Vấn đề là, do kết quả của việc này, tin nhắn được thêm vào trước khi người dùng đăng xuất, và vì vậy tin nhắn được hiển thị ngay sau khi người dùng đăng xuất. Tôi tự hỏi cách tốt nhất để xóa thư trong chế độ xem đăng xuất là gì. Tôi đã nghĩ về hai cách để làm điều này, và tôi tự hỏi liệu có ai có thể nghĩ ra một cách tốt hơn không.

tôi đang thiên vị này:

storage = messages.get_messages(request) 
storage.used = True 

Over này:

storage = messages.get_messages(request) 
del storage._loaded_messages[0] 

Đối với tôi cách thứ hai dường như rõ ràng hơn, mặc dù nó là xấu xí: Mục đích của tôi là để loại bỏ các hiện tin nhắn được tải và điều này làm cho điều đó rõ ràng. Cách đầu tiên sử dụng một phương tiện mà thông điệp sẽ được xóa như là một tác dụng phụ ... nhưng ít nhất nó không dựa vào một biến dunder ... bạn nghĩ gì?

+0

Tôi đoán storage.used = True được triển khai theo mặc định. Bạn không cần phải viết nó. Bạn cần phải viết storage.used = False nếu bạn ghi đè lên hành vi mặc định. –

+2

Tôi đã kết thúc với phương pháp đầu tiên của tôi. Về cơ bản tôi muốn ép buộc hành vi mặc định mà không hiển thị thông báo. Đặt storage.used = True làm cho nó nghĩ rằng nó đã được hiển thị các tin nhắn, và do đó, nó làm việc ra cho tôi. – IntrepidDude

+2

Tôi đồng ý phương pháp đầu tiên tốt hơn. Nếu bạn muốn làm cho nó rõ ràng hơn, bạn luôn có thể tạo ra một hàm gọi là 'clear_messages' mà thực hiện hai bước đó. Sau đó, nếu vì lý do nào đó, hành vi của các thay đổi 'storage.used = True', bạn có thể cập nhật hàm. –

Trả lời

4

Vì mục đích giải quyết, tôi sẽ đánh dấu phương pháp mà tôi đã chọn là "Câu trả lời". Nhờ những người đã nhận xét.

tôi đã đi với điều này:

storage = messages.get_messages(request) 
storage.used = True 

Bởi vì nó có vẻ sạch hơn, dễ dàng hơn để kiểm tra, và phù hợp với thông lệ chung của phần còn lại của dự án.

+3

Điều này không hoạt động –

+2

"storage.used = True" không hoạt động ở Django 1.8.2 và phải lặp lại thông qua messgaes. –

1

Nếu chế độ xem đăng xuất của bạn luôn chuyển hướng đến "trang đăng xuất", thì bạn chỉ có thể thay đổi mẫu đăng xuất để ẩn thư của mình.

ví dụ, trong mẫu:

{% block extra-header %} 
<style type="text/css"> 
    #message-id { display: none; } 
</style> 
{% endblock %} 

Nó cảm thấy một chút 'hacky' nhưng tôi nghĩ rằng nó chắc chắn ít hacky hơn # 2 của bạn.

+0

Tuyệt. Tôi đã không nghĩ về cách tiếp cận đó, nhưng toàn bộ dự án logic kiểm soát việc hiển thị các thông điệp là tách biệt với mã mẫu. Ngoài ra, có vẻ như với tôi rằng phương pháp đầu tiên dễ kiểm tra hơn. – IntrepidDude

+1

Bạn cũng có thể bọc logic hiển thị thư trong '{% if user.is_authenticated%}' nếu bạn không muốn hiển thị thư cho người dùng ẩn danh. – Tom

2

Đối với tôi ở Django 1.5session phương thức lưu trữ thư được chấp nhận không phải là mẹo.

tôi cần thiết để sử dụng:

storage = messages.get_messages(request) 
for _ in storage: 
    pass 

Để thoát khỏi thư từ lưu trữ.

7

Tôi thích cách tiếp cận đơn giản này để xóa bỏ trình lặp cơ bản, vì tôi thực sự muốn thêm một tin nhắn mới vào vị trí của thông điệp Django chuẩn.

list(messages.get_messages(request)) 
+0

Sạch sẽ và đơn giản! – Yoone

1

tôi đã phải sử dụng 2 trong những giải pháp đề xuất ở trên toghether như không ai một mình là enought:

storage = messages.get_messages(request) 
for _ in storage: 
    pass 

if len(storage._loaded_messages) == 1: 
    del storage._loaded_messages[0] 

Theo như giải pháp chấp nhận tôi có thể lặp qua các thông điệp nhiều lần và Tôi thấy rằng các thông báo dường như không bị "tiêu thụ"

0

Một cách làm tương tự trong Django Admin (được thử nghiệm với Django==1.11.6) là ghi đè response_post_*.

def response_post_save_change(self, request, obj): 
    storage = messages.get_messages(request) 
    storage._loaded_messages = [] 

    return super().response_post_save_change(request, obj) 

Và nếu bạn muốn giữ lại chỉ những thông điệp tùy chỉnh của bạn (ví dụ bổ sung trong save_model hoặc bất kỳ phương pháp ghi đè khác) loại bỏ các thông điệp trong hàng đợi cuối cùng (đó là một quảng cáo Django theo mặc định).

def response_post_save_change(self, request, obj): 
    storage = messages.get_messages(request) 

    if len(storage._queued_messages) > 1: 
     del storage._queued_messages[-1] 

    return super().response_post_save_change(request, obj) 
Các vấn đề liên quan