在我的ModelForm實現中,我想根據當前用戶是否是超級用戶來執行不同類型的驗證檢查。我如何訪問當前的請求用戶?django:如何訪問ModelForm中的當前請求用戶?
6
A
回答
10
您可以將用戶對象作爲窗體構造函數中的額外參數傳遞。
例如
f = MyForm(user=request.user)
和構造的樣子:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user',None)
super(MyForm, self).__init__(*args, **kwargs)
,然後使用用戶在clean_XX形式,如你所願
7
注:如果您使用基於類的視圖(CBVS),然後在表單構造函數中傳遞額外參數(例如,在get_forms_class
中)或在form_class
中將不起作用,因爲將顯示<form> object is not callable
。
爲CBVS的解決方案是使用get_form_kwargs
,如:
views.py:
# Sending user object to the form, to verify which fields to display/remove (depending on group)
def get_form_kwargs(self):
kwargs = super(MyView, self).get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
forms.py:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user') # To get request.user. Do not use kwargs.pop('user', None) due to potential security hole
super(MyForm, self).__init__(*args, **kwargs)
# If the user does not belong to a certain group, remove the field
if not self.user.groups.filter(name__iexact='mygroup').exists():
del self.fields['confidential']
相關問題
- 1. 如何在django中訪問當前用戶請求之外
- 2. 如何從bootstrap訪問當前請求?
- 3. 訪問當前請求頭
- 4. 在routes.rb中訪問當前請求?
- 5. 在Form Constraints中訪問當前請求
- 6. 請求從當前用戶
- 7. 如何訪問請求的ModelForm添加request.user爲外鍵
- 8. 如何訪問當前用戶在Django的基於類視圖
- 9. 如何在appengine中訪問當前請求?
- 10. Django。 「請求」對象是無在的ModelForm
- 11. 金字塔得到當前用戶/用戶ID無需訪問請求
- 12. 如何從當前請求訪問MVC「操作」?
- 13. 如何訪問客戶端頭請求
- 14. 如何在requestfactory使用的域對象中訪問當前請求?
- 15. 從Django模板請求ModelForm實例
- 16. Django自定義管理器請求對象/當前用戶
- 17. Django通用視圖 - 訪問請求
- 18. 如何讓用戶請求訪問SharePoint中的特定文檔?
- 19. 在自定義django小部件中訪問當前用戶
- 20. 用django訪問用戶的當前公司社交認證
- 21. 當新請求來自同一用戶時,如何取消先前的請求
- 22. 如何在Django中訪問ModelForm的字段名稱?
- 23. 用戶訪問該網站的請求
- 24. 如何訪問Django-CMS插件中的請求對象?
- 25. 如何訪問django forms.py中的請求對象?
- 26. Django,如何訪問settings.py中的請求對象
- 27. 如何將當前用戶設置爲ModelForm的屬性?
- 28. django:新對象的ModelForm訪問實例
- 29. 如何綁定/註冊當前http請求的用戶與類
- 30. 如何訪問HTTP請求?
很抱歉在原來的問題沒有澄清這一點,但是我的ModelForm連接到了ModelAdmin子類。我如何從ModelAdmin調用ModelForm的自定義構造函數? – zer0stimulus
所以你想在django管理界面中做到這一點?還沒有嘗試過,但我想你可以嘗試覆蓋窗體的__call__方法。例如類似:http://stackoverflow.com/questions/727928/django-admin-how-to-access-the-request-object-in-admin-py-for-list-display-meth –