我的問題是非常相似,這一個:How do I access the request object or any other variable in a form's clean() method?Django的:從管理的form.clean訪問請求對象()
除此之外,我有管理的形式同樣的問題。因此,我無法自己設定初始化表單的方式 - 將請求傳遞給它。
預先感謝。
我的問題是非常相似,這一個:How do I access the request object or any other variable in a form's clean() method?Django的:從管理的form.clean訪問請求對象()
除此之外,我有管理的形式同樣的問題。因此,我無法自己設定初始化表單的方式 - 將請求傳遞給它。
預先感謝。
事實上,有一種方法可以解決您的問題!
您將需要通過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
這是解決這個問題的好方法!不過,我對你在這裏使用術語'MetaClass'有點困惑。正如我所看到的,ModelFormMetaClass只是您表單的超類。我在這裏錯過了什麼? – mkoistinen 2014-11-11 16:02:03
@mkoistinen,你是對的。這個想法在過去有一段時間出現了,但我懶得糾正答案。由於人們仍在使用該片段,因此我有責任糾正它。感謝您的反饋。 :-) – 2014-11-11 20:46:05
感謝您的更新,而且,我在上面的評論中看到了錯誤。它的a *子類*。哎呀! – mkoistinen 2014-11-11 21:37:11
ModelAdmin
類中有許多掛鉤讓您可以做這件事 - 請參閱django.contrib.admin.options
中的代碼。
有兩種方法可能對你有幫助,分別是ModelAdmin.save_form
和ModelAdmin.save_model
,它們都是通過請求對象傳遞的。因此,您可以在Admin子類中重寫這些方法,並執行所需的任何額外處理。
評論
後可進行編輯,您說得很對,這不會讓你驗證依賴於用戶的特權的形式。不幸的是,形式實例化被深埋在add_view
和change_view
方法ModelAdmin
中。
沒有複製大量現有代碼的可能性不大。您可以覆蓋*_view
方法;或者您可以嘗試重寫modelform_factory
函數以返回一個新的類,其中已經包含請求對象;或者你可以嘗試用表單類__new__
方法來做同樣的事情,但由於表單元類的原因,這很棘手。
Django的給你。 – 2010-04-22 13:04:41
@亞當 - 對不起? – Wiseman 2010-04-22 13:37:16