0

我想覆盖saveas按钮的行为 - 我需要在按下它后将我重定向到对象列表中,而不是直接在新对象中。

所以我需要覆盖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

但是在这两个打印请求中都是...我做错了什么吗?

4

2 回答 2

2

Django 表单介于模型和视图之间,这意味着它们与上下文无关。您通常不应该做依赖于request表单内对象的事情。

@Rohan 的意思是AirplanesAdmin在初始化表单时不传入请求对象,因此当您kwargs.pop('request', None)实际上是内部KeyError的并且返回默认值(第二个参数None)时。什么都没有真正弹出kwargs。要覆盖此行为,您需要覆盖ModelAdmin.

阅读文档以了解您可以使用的方法。

于 2013-11-04T10:00:30.690 回答
0

请求对象未从 admin.py 传递给 forms.py

因此,在 admin.py 中:

class AirplanesAdmin(admin.ModelAdmin):
    form = AirplaneEditForm(request=request)

在此处查看另一个示例

于 2017-07-21T10:47:59.343 回答