2010-04-21 31 views

回答

31

事實上,有一種方法可以解決您的問題!

您將需要通過ModelAdmin.get_form()提供subclass form並重寫它:

class BusinessDocumentCommentForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     # Voila, now you can access request anywhere in your form methods by using self.request! 
     super(BusinessDocumentCommentForm, self).__init__(*args, **kwargs) 
     if self.request.GET.get('document_pk', False): 
      #Do something 
    def clean(self): 
     # Do something with self.request 
     # etc.  
    class Meta: 
     model = BusinessDocumentComment 

class BusinessDocumentCommentAdmin(admin.ModelAdmin): 

    form = BusinessDocumentCommentForm  

    def get_form(self, request, obj=None, **kwargs): 

     AdminForm = super(BusinessDocumentCommentAdmin, self).get_form(request, obj, **kwargs) 

     class AdminFormWithRequest(AdminForm): 
      def __new__(cls, *args, **kwargs): 
       kwargs['request'] = request 
       return AdminForm(*args, **kwargs) 

     return AdminFormWithRequest 
+0

這是解決這個問題的好方法!不過,我對你在這裏使用術語'MetaClass'有點困惑。正如我所看到的,ModelFormMetaClass只是您表單的超類。我在這裏錯過了什麼? – mkoistinen 2014-11-11 16:02:03

+1

@mkoistinen,你是對的。這個想法在過去有一段時間出現了,但我懶得糾正答案。由於人們仍在使用該片段,因此我有責任糾正它。感謝您的反饋。 :-) – 2014-11-11 20:46:05

+0

感謝您的更新,而且,我在上面的評論中看到了錯誤。它的a *子類*。哎呀! – mkoistinen 2014-11-11 21:37:11

0

ModelAdmin類中有許多掛鉤讓您可以做這件事 - 請參閱django.contrib.admin.options中的代碼。

有兩種方法可能對你有幫助,分別是ModelAdmin.save_formModelAdmin.save_model,它們都是通過請求對象傳遞的。因此,您可以在Admin子類中重寫這些方法,並執行所需的任何額外處理。

評論

後可進行編輯,您說得很對,這不會讓你驗證依賴於用戶的特權的形式。不幸的是,形式實例化被深埋在add_viewchange_view方法ModelAdmin中。

沒有複製大量現有代碼的可能性不大。您可以覆蓋*_view方法;或者您可以嘗試重寫modelform_factory函數以返回一個新的類,其中已經包含請求對象;或者你可以嘗試用表單類__new__方法來做同樣的事情,但由於表單元類的原因,這很棘手。

+0

丹尼爾,謝謝你的回答!實際上,我已經嘗試覆蓋這些方法,在實現表單之前...但是 - 我知道(從你的答案之一,如果我沒有錯),沒有辦法從這些方法進行驗證。通過「驗證」,我的意思是,如果我不喜歡某些內容並同時能夠提供一些有價值的反饋,則不需要保存某些內容。我的任務是 - 根據用戶權限驗證管理員輸入。可能是我在錯誤的地方挖掘? – Wiseman 2010-04-22 06:00:50

+0

請參閱我上面的擴展答案。 – 2010-04-22 13:03:28

+0

非常感謝,爲了一堆好釣魚竿:)。 – Wiseman 2010-04-22 13:40:41

相關問題