2010-08-19 27 views
6

Tôi đang làm việc trên dự án django, nơi tôi muốn triển khai tín hiệu cần được gọi khi một số địa chỉ người dùng bị thay đổi. Tôi đã thấy các tín hiệu tích hợp nhưng dường như chúng không hoạt động trong trường hợp của tôi, bởi vì nếu tôi sử dụng lưu thì sẽ được gọi trong các sự kiện lưu khác và mặc dù tôi có thể tạo tín hiệu tùy chỉnh, tôi không thể tìm ra Tôi nên gọi cái này bằng cách nào?Tạo tín hiệu django để cập nhật chi tiết người dùng

Vui lòng đề xuất.

Xin cảm ơn trước.

Trả lời

16

Bắt đầu bằng cách xác định tín hiệu tùy chỉnh. Tín hiệu tùy chỉnh ở đây là một lớp con của django.dispatch.Signal. Mã này có thể sống ở app/signals.py.

from django.dispatch import Signal 
user_address_changed = Signal(providing_args=["user"]) 

Tiếp theo, hãy đảm bảo bạn gửi tín hiệu này khi thay đổi địa chỉ của người dùng. Tùy thuộc vào cách bạn đã xác định UserAddress điều này có thể được thực hiện ở những nơi khác nhau. Giả sử rằng có một chế độ xem cho phép người dùng cập nhật các mô hình Address của họ. Mã này có lẽ là trong app/views.py.

from app import signals 

def update_address(request, *args, **kwargs): 
    # all the changes go well. 
    signals.user_address_changed.send(sender=None, user=request.user) 
    # Render to template etc. 

Bây giờ bạn cần thiết lập bộ thu cho tín hiệu này.

from app.signals import user_address_changed 

def handle_user_address_change(sender, **kwargs): 
    """Trap the signal and do whatever is needed""" 
    user = kwargs['user'] 
    # Write to log, update db, send mail etc. 

user_address_changed.connect(handle_user_address_change) 

Cập nhật

(Sau khi đọc comment; OP giải thích rằng không có cái nhìn riêng biệt mà cập nhật địa chỉ) Trong trường hợp đó bạn có thể thử để ghi đè User.save() để gửi ra tín hiệu này. Tôi nói "thử" vì tôi không biết liệu bạn có đang sử dụng lớp học User của riêng bạn hay auth.User.

+0

cảm ơn manoj trả lời của bạn, điều này sẽ hoạt động tốt cho các bản cập nhật của người dùng. Nhưng nếu chúng tôi thay đổi địa chỉ thông qua bảng quản trị, chế độ xem này sẽ không được gọi và do đó tín hiệu này sẽ không được gửi. –

+0

Đã cập nhật câu trả lời. Xem ở trên. –

+0

một mô hình riêng biệt với người dùng là khóa ngoài .. vì vậy tôi đoán User.save() là không thể trong trường hợp này? –

1

Bạn có thể đánh giá cao django-signalqueue:

https://github.com/fish2000/django-signalqueue

Đó là một phần mở rộng này cho người nhận tín hiệu chứng khoán cung cấp một lớp AsyncSignal. Gọi lại AsyncSignal có thể được thực hiện trên một chuỗi công nhân riêng biệt - bạn có thể kiểm soát hành vi cụ thể của các trình lắng nghe không đồng bộ mà bạn xác định.

(tiết lộ đầy đủ: Tôi đã viết nó.)

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