如何从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 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看