3 回答

TA貢獻1860條經驗 獲得超8個贊
我現在將它與元類(而不是方法)一起使用,因為Django 1.3否則會顯示一些怪異之處。
class MyModelAdmin(admin.ModelAdmin):
form = MyCustomForm
def get_form(self, request, obj=None, **kwargs):
ModelForm = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
class ModelFormMetaClass(ModelForm):
def __new__(cls, *args, **kwargs):
kwargs['request'] = request
return ModelForm(*args, **kwargs)
return ModelFormMetaClass
然后重寫MyCustomForm.__init__如下:
class MyCustomForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(MyCustomForm, self).__init__(*args, **kwargs)
然后,您可以使用ModelFormwith的任何方法訪問請求對象self.request。

TA貢獻2016條經驗 獲得超9個贊
值得一說的是,如果使用的是基于類的視圖,而不是基于函數的視圖,請get_form_kwargs在編輯視圖中覆蓋。自定義CreateView的示例代碼:
from braces.views import LoginRequiredMixin
class MyModelCreateView(LoginRequiredMixin, CreateView):
template_name = 'example/create.html'
model = MyModel
form_class = MyModelForm
success_message = "%(my_object)s added to your site."
def get_form_kwargs(self):
kw = super(MyModelCreateView, self).get_form_kwargs()
kw['request'] = self.request # the trick!
return kw
def form_valid(self):
# do something
上面的視圖代碼將request作為關鍵字的參數之一提供給表單的__init__構造函數。因此,在您ModelForm執行以下操作:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
# important to "pop" added kwarg before call to parent's constructor
self.request = kwargs.pop('request')
super(MyModelForm, self).__init__(*args, **kwargs)
添加回答
舉報