Django Admin:在内联管理中访问父实例
DjangoAdmin: Accesing the parent instance within an Inline admin
我有一个 Django 管理员 class,它声明了一个可迭代的内联。类似于:
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
...
...
inlines = [CategoryModifiersInline,]
...
...
然后我有一个内联管理员 class 是这样的:
class CategoryModifiersInline(admin.TabularInline):
model = Category.modifiers.through
fk_name = 'category'
extra = 1
def formfield_for_foreignkey(self, db_field, request, **kwargs):
qs = Product.objects.filter(is_modifier=True).filter(active=True)
kwargs['queryset'] = qs
return super(CategoryModifiersInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
我根据一些业务需求过滤外键的查询集。
此内联仅在 change
视图中向用户显示,这意味着,当创建 class 类别的对象并且用户想要向其添加修饰符时,永远不会在add
视图。
我想做的是通过类别模型的属性之一过滤外键,我的意思是,我想从 formfield_for_foreignkey
方法访问父对象。
有谁知道实现它的方法吗?
嗯,我在Whosebug这里找到了一个similar question,然后用那里描述的方法解决了。
它使用来自内联的 parent_model
属性,以及来自 django.core.urlresolvers
的 resolve
方法来获取基于 url.
的实例
代码如下:
def get_object(self, request):
resolved = resolve(request.path_info)
if resolved.args:
return self.parent_model.objects.get(pk=resolved.args[0])
return None
然后我会在我的 formfield_from_foreignkey
方法中调用 get_object
方法来获取我想用作过滤器的对象的实例。
希望对您有所帮助!
我有一个 Django 管理员 class,它声明了一个可迭代的内联。类似于:
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
...
...
inlines = [CategoryModifiersInline,]
...
...
然后我有一个内联管理员 class 是这样的:
class CategoryModifiersInline(admin.TabularInline):
model = Category.modifiers.through
fk_name = 'category'
extra = 1
def formfield_for_foreignkey(self, db_field, request, **kwargs):
qs = Product.objects.filter(is_modifier=True).filter(active=True)
kwargs['queryset'] = qs
return super(CategoryModifiersInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
我根据一些业务需求过滤外键的查询集。
此内联仅在 change
视图中向用户显示,这意味着,当创建 class 类别的对象并且用户想要向其添加修饰符时,永远不会在add
视图。
我想做的是通过类别模型的属性之一过滤外键,我的意思是,我想从 formfield_for_foreignkey
方法访问父对象。
有谁知道实现它的方法吗?
嗯,我在Whosebug这里找到了一个similar question,然后用那里描述的方法解决了。
它使用来自内联的 parent_model
属性,以及来自 django.core.urlresolvers
的 resolve
方法来获取基于 url.
代码如下:
def get_object(self, request):
resolved = resolve(request.path_info)
if resolved.args:
return self.parent_model.objects.get(pk=resolved.args[0])
return None
然后我会在我的 formfield_from_foreignkey
方法中调用 get_object
方法来获取我想用作过滤器的对象的实例。
希望对您有所帮助!