我想覆盖 saveas 按钮的bahaviour - 我需要在推送它之后重定向我,不是在对象列表中,而是直接在新对象中。
所以我需要覆盖 ModelForm 的标准保存方法并进入请求对象 - 检查是否 saveas 按钮被按下:
*admin.py
class AirplanesAdmin(admin.ModelAdmin):
form = AirplaneEditForm
forms.py
class AirplaneEditForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(AirplaneEditForm, self).__init__(*args, **kwargs)
def clean(self):
print self.request
return self.cleaned_data
def save(self, force_insert=False, force_update=False, commit=True,):
plane = super(AirplaneEditForm, self).save(commit=False)
print self.request
if commit:
plane.save()
return plane
class Meta:
model = Airplanes
但是在打印中,请求无 ...我做错了什么?
答案 0 :(得分:2)
Django表单是模型和视图之间的东西,这意味着它们与上下文无关。您通常不应该做依赖于表单内request
个对象的事情。
@Rohan的含义是AirplanesAdmin
在您的表单初始化时未传递请求对象,因此当您kwargs.pop('request', None)
实际上是内部KeyError
和默认值(返回第二个参数None
)。 kwargs
没有真正弹出任何东西。要覆盖此行为,您需要覆盖ModelAdmin
。
阅读the doc了解您可以使用的方法。
答案 1 :(得分:0)
请求对象未从admin.py
传递给forms.py所以,在admin.py中:
class AirplanesAdmin(admin.ModelAdmin):
form = AirplaneEditForm(request=request)
请参阅另一个示例here