2009-09-03 30 views

Trả lời

2

Một cách là để móc vào mô hình nội tuyến của bạn 'pre_save' tín hiệu:

from django.db.models.signals import pre_save 
from your_app.models import YourModel 

def callback(sender, **kwargs): 
    # 'instance' is the model instance that is about to be saved, 
    # so you can do whatever you want to it. 
    instance.field = new_value 

pre_save.connect(callback, sender=YourModel) 

Nhưng tôi không chắc chắn lý do tại sao bạn không thể chỉ ghi đè lên các phương pháp save, mà hầu như luôn là cách tiếp cận tốt hơn.

+0

+1 Để chỉ ra rằng tốt hơn là ghi đè phương thức 'save()' trên Mô hình! – Caumons

9

Để tùy chỉnh tiết kiệm của inlines, bạn có thể ghi đè lên FormSet

class SomeInlineFormSet(BaseInlineFormSet): 
    def save_new(self, form, commit=True): 
     return super(SomeInlineFormSet, self).save_new(form, commit=commit) 

    def save_existing(self, form, instance, commit=True): 
     return form.save(commit=commit) 

class SomeInline(admin.StackedInline): 
    formset = SomeInlineFormSet 
    # .... 

Lưu ý rằng save_new() chỉ sử dụng các hình thức để lấy dữ liệu, nó không cho phép các ModelForm cam kết dữ liệu. Thay vào đó, nó tự xây dựng mô hình. Điều này cho phép nó chèn quan hệ cha mẹ vì chúng không tồn tại trong biểu mẫu. Đó là lý do tại sao ghi đè form.save() không hoạt động.

Trong trường hợp của inlines chung, phương pháp form.save() không bao giờ được gọi, và form.cleaned_data được sử dụng thay thế để nhận tất cả các giá trị, và Field.save_form_data() được sử dụng để lưu trữ các giá trị trong trường hợp mô hình.


FYI, một số mẹo chung để tìm ra những thứ như vậy; nó thực sự có giá trị để có một IDE (hoặc có thể cấu hình vim hoặc thiết lập tuyệt vời) cho phép để nhảy đến các định nghĩa biểu tượng thực sự dễ dàng. Đoạn mã trên được tìm ra bằng cách nhảy vào mã inline/formset và xem điều gì đang xảy ra. Trong trường hợp của PyCharm, nó hoạt động bằng cách giữ Command (hoặc Ctrl) và nhấp vào biểu tượng. Nếu bạn là người dùng vim, ctags có thể thực hiện một điều tương tự cho bạn.

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