如何从Django中的inlineadmin获取当前模型实例
发布于 2021-01-29 15:23:56
我正在使用django文档中的formfield_for_manytomany
给定。但是在该函数中,我需要获取当前正在编辑的父对象。
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "car":
kwargs["queryset"] = Cars.objects.filter(owner=person)
return super(myModel, self).formfield_for_manytomany(db_field, request, **kwargs)
如何获得正在编辑的人?
关注者
0
被浏览
48
1 个回答
-
如果
person
无法轻松获取request
,则可能需要通过覆盖ModelAdmin.get_form()
或手动传递它InlineModelAdmin.get_formset()
:from functools import partial class MyModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request, obj=obj) return super(MyModelAdmin, self).get_form(request, obj, **kwargs) def formfield_for_dbfield(self, db_field, **kwargs): person = kwargs.pop('obj', None) formfield = super(MyModelAdmin, self).formfield_for_dbfield(db_field, **kwargs) if db_field.name == "car" and person: formfield.queryset = Cars.objects.filter(owner=person) return formfield # or its inline class MyInlineModelAdmin(admin.StackedInline): def get_formset(self, request, obj=None, **kwargs): kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request, obj=obj) return super(MyInlineModelAdmin, self).get_formset(request, obj, **kwargs) def formfield_for_dbfield(self, db_field, **kwargs): person = kwargs.pop('obj', None) formfield = super(MyInlineModelAdmin, self).formfield_for_dbfield(db_field, **kwargs) if db_field.name == "car" and person: formfield.queryset = Cars.objects.filter(owner=person) return formfield
要么
class MyModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request, obj=obj) return super(MyModelAdmin, self).get_form(request, obj, **kwargs) def formfield_for_dbfield(self, db_field, **kwargs): if db_field.name != "car": kwargs.pop('obj', None) return super(MyModelAdmin, self).formfield_for_dbfield(db_field, **kwargs) def formfield_for_manytomany(self, db_field, request=None, **kwargs): person = kwargs.pop('obj', None) if db_field.name == "car" and person: kwargs['queryset'] = Cars.objects.filter(owner=person) return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)