django - 如何在 Django 管理页面(在 formfield_for_foreignkey 内)中获取实际的对象 ID?

标签 django django-models django-admin

我已经解决了使用此代码编辑对象 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)

但是,int(request.path.split('/')[4])真的很难看。我想知道如何从 Django AdminModel 获取 id。我确信它就在里面的某个地方,有人知道吗?

提前谢谢您! ;D

最佳答案

经过一番挖掘,我们能够获取传递给管理 View 的参数(在由 django admin 的 urls.py 解析之后)并使用它(self_pub_id)来获取对象:

class PublicationAdmin(admin.ModelAdmin):

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "authors":
            #this line below got the proper primary key for our object of interest
            self_pub_id = request.resolver_match.args[0]

            #then we did some stuff you don't care about
            pub = Publication.objects.get(id=self_pub_id)
            kwargs["queryset"] = pub.authors.all()
        return super(PublicationAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)

一个更优雅的解决方案是使用已接受的答案推荐并利用 get_form ModelAdmin 成员函数。就像这样:

class ProfileAdmin(admin.ModelAdmin):
    my_id_for_formfield = None
    def get_form(self, request, obj=None, **kwargs):
        if obj:
            self.my_id_for_formfield = obj.id
        return super(ProfileAdmin, self).get_form(request, obj, **kwargs)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "person":
            kwargs["queryset"] = Person.objects.filter(profile=self.my_id_for_formfield)
        return super(ProfileAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

关于django - 如何在 Django 管理页面(在 formfield_for_foreignkey 内)中获取实际的对象 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4618085/

相关文章:

Django - 搜索相关字段

django - 编辑Django管理员登出范本吗?

python - 为什么 'model' 对象不可迭代?

python - Django Admin - 如何禁止创建已经存在的对象

python - 动态限制相关字段的查询集

django - 如何在 Django Rest Framework (DRF) 中控制版本控制

Django:双向一对一关系。小鸡还是鸡蛋?

css - 带有 Apache2 的 Django 管理页面

django - 如何为 Heroku 上托管的 Django 项目设置 Travis CI?

python - Django 和 "Ordinary"Python 类成员和实例成员的区别?