我已经解决了使用此代码获取对象ID的问题:
class CompanyUserInline(admin.StackedInline):
"""
Defines tabular rules for editing company users direct in company admin
"""
model = CompanyUser
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "user":
users = User.objects.filter( Q(is_superuser=False) )
query = Q()
for u in users:
aux = CompanyUser.objects.filter(user=u)
if aux.count() == 0:
query |= Q(pk=u.id)
try:
cpu = CompanyUser.objects.filter(company__id=int(request.path.split('/')[4]))
for p in cpu:
query |= Q(pk=p.user.id)
except:
pass
kwargs["queryset"] = User.objects.filter(query).order_by('username')
return super(CompanyUserInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)
但是,int(request.path.split('/')[4])真的很难看.我想知道如何从Django AdminModel获取id.我确定它在里面,有谁知道?
先感谢您!; d
根据这个答案,我能够过滤外键选择:
但是当我将spm标记为autocomplete_field:时autocomplete_fields = ['spm'],spm字段从选择字段变为自动完成搜索字段:

但外键选择不再受"formfield_for_foreignkey"中配置的限制.
即使我在formfield_for_foreignkey方法中附加小部件,spm自动完成选项也会受到限制:
@admin.register(CustomModel)
class CustomModelAdmin(admin.ModelAdmin):
#autocomplete_fields = ['spm']
search_fields = ['name']
def get_form(self, request, obj=None, **kwargs):
request.current_object = obj
return super(CustomModelAdmin, self).get_form(request, obj, **kwargs)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'spm':
instance = request.current_object
if instance.brand and instance.memory_size:
filtered_qs=StandardProductWithMemorySize.objects.filter(
product__brand=instance.brand,
memory_size=instance.memory_size
)
kwargs['queryset'] = filtered_qs
db = kwargs.get('using')
kwargs['widget'] = AutocompleteSelect(db_field.remote_field, self.admin_site)
return super(
CustomModelAdmin, self
).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)