【发布时间】:2015-02-05 14:28:11
【问题描述】:
我有这样一个问题:我想限制内联模型管理中的外键选择,但我想根据这个内联对象中指定的一些值来执行此操作。
如何在 InlineModelAdmin 方法中访问内联对象(不是父对象)(特别是在 formfield_for_foreignkey(self, db_field, request, **kwargs) 中)?
【问题讨论】:
标签: django django-admin inline-formset
我有这样一个问题:我想限制内联模型管理中的外键选择,但我想根据这个内联对象中指定的一些值来执行此操作。
如何在 InlineModelAdmin 方法中访问内联对象(不是父对象)(特别是在 formfield_for_foreignkey(self, db_field, request, **kwargs) 中)?
【问题讨论】:
标签: django django-admin inline-formset
您无法访问任何 InlineModelAdmin 方法中的内联对象。
唯一的方法是使用一个自定义的模型表单,它在初始化时接收instance。注意extra 形成新的内联对象接收和“空”instance (pk=None)。
from django.forms import ModelForm
from django.contrib.admin import ModelAdmin, TabularInline
class QuestionForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.pk:
# do what you want with inline object instance
class Meta:
model = Question
fields = "__all__"
class QuestionInline(TabularInline):
model = Question
form = QuestionForm
class CategoryAdmin(ModelAdmin):
model = Category
inlines = [QuestionInline]
【讨论】:
这应该适合你。用您的正确值更改“YourModelAdmin”、“target_field”、“your_custom_condition”和“...”。
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
field = super(YourModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
if db_field.name == 'target_field':
if request and your_custom_condition:
field.queryset = field.queryset.filter(...)
return field
【讨论】:
formfield_for_foreigkey 和适当的db_field 内部,我想根据当前内联模型对象过滤可能的选项。那么如何访问这个对象呢?