Django Admin - 根据当前正在编辑的对象过滤选择字段
Django Admin - Filter Choice Field based on current object being edited
我试图将正在编辑的当前对象从选择字段中排除到 select 来自同一模型的父对象。例如:
from django import forms
from django.contrib import admin
class RelationForm(forms.ModelForm):
parent = forms.ModelChoiceField(queryset=Ingredient.objects.exclude(id=current_ingredient_id))
def save(self, commit=True):
parent = self.cleaned_data.get('parent', None)
# ...do something with extra_field here...
return super(RelationForm, self).save(commit=commit)
class Meta:
model = IngredientRelations
exclude = ['description']
@admin.register(Ingredient)
class IngredientAdmin(admin.ModelAdmin):
form = RelationForm
fieldsets = (
(None, {
'fields': ('name', 'slug', 'description', 'parent',),
}),
)
困难在于获取正在编辑的当前对象,然后在查询集参数的 RelationForm 中获取其主键。
我曾尝试在 IngredientAdmin 中使用 ModelAdmin.formfield_for_foreignkey and ModelAdmin.formfield_for_choice_field,但没有成功。
有什么想法吗?
执行此操作的规范方法是使用当前编辑的实例 ID 更新 __init__
方法中的 queryset
。
class RelationForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(RelationForm, self).__init__(*args, **kwargs)
if self.instance.id:
self.fields['parent'].queryset = Ingredient.objects.exclude(id=self.instance.id)
class Meta:
model = IngredientRelations
exclude = ['description']
最初在这个答案中看到:
我试图将正在编辑的当前对象从选择字段中排除到 select 来自同一模型的父对象。例如:
from django import forms
from django.contrib import admin
class RelationForm(forms.ModelForm):
parent = forms.ModelChoiceField(queryset=Ingredient.objects.exclude(id=current_ingredient_id))
def save(self, commit=True):
parent = self.cleaned_data.get('parent', None)
# ...do something with extra_field here...
return super(RelationForm, self).save(commit=commit)
class Meta:
model = IngredientRelations
exclude = ['description']
@admin.register(Ingredient)
class IngredientAdmin(admin.ModelAdmin):
form = RelationForm
fieldsets = (
(None, {
'fields': ('name', 'slug', 'description', 'parent',),
}),
)
困难在于获取正在编辑的当前对象,然后在查询集参数的 RelationForm 中获取其主键。
我曾尝试在 IngredientAdmin 中使用 ModelAdmin.formfield_for_foreignkey and ModelAdmin.formfield_for_choice_field,但没有成功。
有什么想法吗?
执行此操作的规范方法是使用当前编辑的实例 ID 更新 __init__
方法中的 queryset
。
class RelationForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(RelationForm, self).__init__(*args, **kwargs)
if self.instance.id:
self.fields['parent'].queryset = Ingredient.objects.exclude(id=self.instance.id)
class Meta:
model = IngredientRelations
exclude = ['description']
最初在这个答案中看到: