在Django 1.9(python3.4)中使用GenericStackedInline我想在Django管理中保存我的模型之前访问请求对象。在
当使用MediaItemAdmin
时,我可以在obj.save()
运行之前截获save函数,如下例所示:
管理员py
class StuffAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
# Do some stuff here like obj.user = request.user before saving.
obj.save()
但是,使用GenericStackedInline
时,相同的行为或“钩子”是不可用的。它似乎直接调用模型保存方法:
管理员py
^{pr2}$据我所知,GenericStackedInline
继承自form
,因此我还尝试使用一个表单并重写它,如本例所示:
管理员py
class StuffAdmin(GenericStackedInline):
model = StuffModel
form = StuffForm
class StuffForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(StuffForm, self).__init__(*args, **kwargs)
def save_model(self, request, obj, form, change):
print("Still not run!(")
obj.save()
def save_form(self, request, obj, form, change):
print("Work already!")
obj.save()
我搜索过stackoverflow,但是大多数都没有答案,如这里所示accessing request object within a django admin inline model或者说使用init
来做类似self.request = kwargs.pop('request')
的事情,但是,request
从来没有在这里传递,对吧?在
不管怎样,在调用model save()之前,你知道如何调用request对象并更新我的实例吗?在
保存“inlines”的方法是}。在
ModelAdmin
的一部分,而不是{如果要检查窗体集是否是
^{pr2}$BarInline
的窗体集,可以执行以下操作:或者更棒的是,让它通用:
如果您需要在每次保存表单之前而不是在每个表单集之前处理请求,则必须使用您自己的表单,并且表单集通过表单集将请求传播到表单:
根据您的用例,save方法也可能看起来像这样:
管理类不是从表单继承的;它们包含表单。ModelForms没有
save_model
或save_form
方法,它们只有一个save
方法。完全可以重写该方法,但它不接受request
;您还需要重写__init__
来接受该参数并从modeldadmin的get_form_kwargs
方法传入。在相关问题 更多 >
编程相关推荐