2013-11-04 73 views
0

我要重写的另存为按钮bahaviour - 我需要推动它redirecrt我不在对象列表之后,但在一个新的对象直接。Django。 “请求”对象是无在的ModelForm

,所以我需要重写非标准保存的方法的ModelForm,并在那里得到要求对象 - 要检查是否已按下另存为按钮:

*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 

但在这两个打印请求 ...难道我做错了什么?

+1

您需要通过'request'在init中明确指出,这不是由模型管理员完成的。 – Rohan

+0

你能写一个代码示例吗?我尝试这样做,但Django的tolds我,他不知道** **请求对象admin.py – user2919162

回答

2

Django的形式是模型和视图之间的事情,这意味着它们的上下文无关。您通常不应该在窗体内部执行取决于request对象的事情。

@Rohan的意思是:AirplanesAdmin不要求对象时,通过表单被初始化,所以当你kwargs.pop('request', None)实际是内部KeyError和默认值返回(第二个参数,None)。没有什么是从kwargs真的弹出。要覆盖此行为,您需要覆盖ModelAdmin的渲染方法。

阅读the doc你可以使用的方法。

+2

在文档望去,** ** save_model方法解决了所有我的问题。非常感谢 – user2919162

0

Request对象没有被通过从admin.py

所以要的forms.py,在admin.py:

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

见另一个例子here

+0

嗯。 'AirplaneEditForm(request = request)'在_class definition_时使用'request'的值(如果有的话)。 – tzot

+0

我认为你是对的@tzot。也许我会删除我的答案 – Anupam