Django的。 ModelForm中的'request'对象为None

时间:2013-11-04 09:44:06

标签: django django-forms django-admin

我想覆盖 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

但是在打印中,请求 ...我做错了什么?

2 个答案:

答案 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