2010-02-12 26 views
5

tôi đang làm một số nội dung về 'sạch' trên một ModelForm admin:Cách truy cập request.user từ một phương thức làm sạch ModelForm của quản trị viên?

class MyAdminForm(forms.ModelForm): 
    def clean(self): 
     # Some stuff happens... 
     request.user.message_set.create(message="Some stuff happened") 

class MyAdmin(admin.ModelAdmin): 
    form = MyAdminForm 

Khác với các threadlocals hack - làm thế nào để truy cập request.user để thiết lập một tin nhắn? Tôi không thể chuyển nó cho constructor biểu mẫu vì không được gọi từ mã của tôi.

Trả lời

4

Bạn không thể làm điều đó trên biểu mẫu mà không chuyển người dùng vào hàm tạo biểu mẫu. Thay vào đó, bạn có thể sử dụng hàm ModelAdmin.save_model được cung cấp đối tượng yêu cầu.

Phương pháp save_model được cho HttpRequest, một trường hợp mô hình, một ModelForm dụ và một giá trị boolean dựa vào việc nó được thêm hoặc thay đổi đối tượng. Tại đây bạn có thể làm mọi hoạt động trước hoặc sau khi lưu.

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

Edit: Vì bạn muốn đặt logic/tin nhắn trong hàm sạch bạn có thể làm một cái gì đó như:

class MyAdminForm(forms.ModelForm): 
    user_messages = [] 
    def clean(self): 
     # Some stuff happens... 
     user_messages.append("Some stuff happened") 

class MyAdmin(admin.ModelAdmin): 
    form = MyAdminForm 
    def save_model(self, request, obj, form, change): 
     for message in form.user_messages: 
      request.user.message_set.create(message=message) 

Rất muộn chỉnh sửa:

user.message_set là thiết lập để không được chấp nhận trong Django 1.4. Thay vào đó, bạn nên sử dụng ModelAdmin.message_user. https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user

+1

Mmmmm. Thông điệp phụ thuộc vào một số logic xác nhận để làm cho cảm giác sống tốt hơn trong phương thức cleanF (ModelForm clean). Nếu tôi di chuyển nó đến ModelAdmin save_model() Tôi sẽ phải viết một số logic lộn xộn chỉ vì lợi ích của việc gửi một tin nhắn! –

+0

Điểm công bằng. Kiểm tra chỉnh sửa của tôi và xem điều đó có hữu ích hay không. –

+0

Tôi đã chuyển user_messages vào init của biểu mẫu và tự thêm. đến dòng 'user_messages.append' và điều đó đã có tác dụng! Cảm ơn. –

-1

Bạn sẽ phải vượt qua một cách rõ ràng nó ở đó trong constructor, mà không phải là một điều, đó là thường được thực hiện.

Bạn có chắc chắn muốn đưa nội dung đó vào biểu mẫu không? Chính xác bạn muốn làm gì ở đó? Không nâng cao ValidationError đủ?

+0

Như đã đề cập các Constructor không có trong mã của tôi - đó là trong contrib.admin. Thư tôi muốn gửi không phải là lỗi. Đó là một thông báo khi lưu biểu mẫu đã ảnh hưởng đến một phần khác của hệ thống. –

+0

Nhưng điều này là lạ - làm thế nào bạn có thể chắc chắn, rằng bạn nên gửi tin nhắn trước khi thực sự lưu các đối tượng từ các hình thức? Có thể xảy ra nhiều thứ khác nhau giữa sạch sẽ và tiết kiệm. – gruszczy

+0

Ghi nhớ chúng ta đang nói về quan điểm thay đổi quản trị những gì có thể xảy ra giữa sạch sẽ và tiết kiệm? –

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