如何从内联模型管理访问父示例?
我的目标是根据父示例的状态覆盖has_add_permission
函数。如果父示例的状态不是1,我不想允许添加子示例。
class ChildInline(admin.TabularInline):
model = Child
form = ChildForm
fields = (
...
)
extra = 0
def has_add_permission(self, request):
# Return True only if the parent has status == 1
# How to get to the parent instance?
#return True
class ParentAdmin(admin.ModelAdmin):
inlines = [ChildInline,]
7条答案
按热度按时间uajslkp61#
BaseInlineFormSet具有属性
self.instance
,该属性是对父对象的引用。在构造函数中,使用这个示例初始化和过滤queryset,如果需要调整,可以更改构造函数的queryset参数,或者根据需要使用
inlineformset_factory
设置表单集。请参阅https://docs.djangoproject.com/en/3.2/_modules/django/forms/models/
如果您从这里扩展,请确保在访问
self.instance
之前运行super().__init__()
。kfgdxczn2#
您只需要添加obj参数并检查父模型状态
prdp8dxp3#
如果路径中不需要数字,也可以使用re module从请求路径中检索它。
例如:
或
muk1a3rh4#
将以下内容放置在父管理模型上,以便父模型示例可用于父模型下的任何内联对象:
然后,在行内(以
customers
字段为例):nlejzf6q5#
Django〈2.0答案:
使用Django的Request对象(您可以访问)来获取
request.path_info
,然后从resolve
匹配的参数中获取PK。Django〉= 2.0答案:
Mark Chackerian获得以下更新:
使用Django的Request对象(您可以访问它)来检索
request.path_info
,然后从resolve
匹配中的参数中检索PK。例如:b5buobof6#
我认为这是一种在内联模型中获取父示例的更简洁的方法。
gpfsuwkq7#
我尝试了解决方案的迈克尔B,但不为我工作,我不得不使用这个代替(一个小修改,使用kwargs):