11

xem xét như sau:django tín hiệu post_save gửi formsets inline lỗi thời

class OrderForm(models.Model): 
    title = models.CharField(max_length=100) 
    desc = models.TextField() 


class OrderFormLine(models.Model): 
    order = models.ForeignKey(OrderForm) 
    lagel = models.CharField(max_length=100) 
    qty = models.IntegerField(...) 
    price = models.FloatField(...) 

Bây giờ tôi muốn gửi một email với các chi tiết orderform bất cứ khi nào ai đó tạo ra một hoặc sửa đổi một.

Không có khoa học tên lửa nào cho đến giờ .. hãy sử dụng tín hiệu post_save;

post_save.connect(email_notify, sender=OrderForm) 

Nhưng có một vấn đề nhỏ, đối tượng OrderForm được chuyển đến email_notify được cập nhật với dữ liệu mới như mong đợi, chứ không phải các mục OrderFormLine liên quan.

Tôi đã cố gắng ghi đè các phương thức lưu trong quản trị VÀ trong mô hình, tôi đã cố lưu đối tượng, biểu mẫu và mối quan hệ của nó trước khi chuyển nó tới trình xử lý thông báo của tôi, không có gì hoạt động.

Tôi biết rằng tôi có thể đính kèm tín hiệu post_save vào mô hình OrderItem, nhưng sau đó email sẽ được gửi cho từng mục.

Trợ giúp tôi đang trên bờ vực của sự điên rồ.

CẬP NHẬT:

Found a simple and reliable solution

câu chuyện ngắn:

def email_notify_orderform(sender, **kwargs): 
    instance = kwargs['instance'] 
    ct = ContentType.objects.get_for_model(OrderForm) 
    if ct.id == instance.content_type.id: 
     print instance.is_addition() 
     print instance.is_change() 
     print instance.is_deletion() 
     print instance.change_message 
     print instance.action_time 
     print instance.get_edited_object().total() # BINGO ! 
post_save.connect(email_notify_orderform, sender=LogEntry) 
+1

Bạn phải lưu mẫu đơn đặt hàng để có số ID hợp lệ để liên kết với Chi tiết đơn hàng của mình. Dường như với tôi rằng một tín hiệu tùy chỉnh là theo thứ tự; có thể cứu bạn khỏi sự điên rồ của bạn. Đôi khi, trường hợp đặc biệt không phải là điều ác, và đây là một trường hợp đặc biệt rất nhỏ. Các tín hiệu "OrderForm" khi nó được khởi tạo hoàn toàn và người nghe của bạn chờ đợi thay vì post_save. –

+0

Tôi chưa bao giờ nghe nói về cách viết các tín hiệu tùy chỉnh .. và tôi không thể tìm thấy nhiều về chủ đề này. Từ những gì tôi hiểu tín hiệu được kết hợp chặt chẽ trong django và không có cơ chế tại chỗ để cung cấp tín hiệu tùy chỉnh. Nó được ghi chép? –

+0

nevermind, tìm thấy tài liệu –

Trả lời

6

Vấn đề cơ bản là khi các đối tượng chính post_save tín hiệu được gửi đi, inlines đã chưa được lưu: các mô hình gốc luôn được lưu trước tiên. Vì vậy, nó không phải là nó gửi dữ liệu cũ; trên thực tế, đó là trạng thái hiện tại của dữ liệu.

Giải pháp đơn giản nhất là tạo tín hiệu tùy chỉnh và có tín hiệu đó được gửi tại địa điểm đã lưu các dòng nội tuyến. Phương pháp save_formset trên ModelAdmin là móc của bạn.

+0

Trừ khi có một cái gì đó tôi không nhận được về câu trả lời của bạn, nó không hoạt động. Bạn có thể thấy trong bài đăng trên blog tất cả các phương pháp tôi đã thử, nó bao gồm sử dụng save_formset: http://haineault.com/blog/141/ –

+0

@ h3 Bạn đã nhận được ý tưởng chưa? Đã lâu rồi nhưng bạn có thể kiểm tra [post] này (http: // stackoverflow).com/questions/14858559/save-the-related-objects-trước-the-fact-object-đang-được-edited-on-django-admin) và các giải pháp của nó minh họa việc sử dụng [save_formset] (https: // docs. djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset). Tôi đã để lại nhận xét trong trường hợp ai đó gặp phải bài đăng này – raratiru

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