Django 如何为“def formfield”for“u manytomany”提供可编辑对象的id

Django 如何为“def formfield”for“u manytomany”提供可编辑对象的id,django,django-models,django-admin,django-forms,Django,Django Models,Django Admin,Django Forms,我如何才能为多个的def formfield\u提供可编辑对象的id?假设您正在查找由ReportAdmin编辑的报表实例,请尝试以下操作: class Report(models.Model): precursor = models.ManyToManyField(Precursor) class ReportAdmin(admin.ModelAdmin): def formfield_for_manytomany(self, db_field, request, **kwa

我如何才能为多个的def formfield\u提供可编辑对象的id?

假设您正在查找由
ReportAdmin
编辑的
报表
实例,请尝试以下操作:

class Report(models.Model):
    precursor = models.ManyToManyField(Precursor)

class ReportAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        ops_area = Report.objects.get(id=???????).ops_area
        print id
        print ops_area
        if db_field.name == "r_precursor":
            kwargs["queryset"] = Precursor.objects.filter(ops_area=ops_area)
            print kwargs
        return super(ReportAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)

DrMeer在其他方面的出色回答的问题是,对象将缓存在
ModelAdmin
实例中,其生存期将延长到下一次
get_object()
调用。但是,添加新报告时不会调用
get_object()
,因此在更改现有报告后添加新报告时,将出现错误的上一个报告
obj

更安全的方法是将报表对象缓存在请求中,这样它就有了请求范围:

class ReportAdmin(admin.ModelAdmin):
def get_对象(self、request、object_id、from_field=None):
obj=super()。获取\u对象(请求,对象\u id,从\u字段=从\u字段)
#缓存对象以在formfield\u for\u manytomany中使用
request.report_obj=obj
返回obj
def formfield_for_manytomy(self、db_字段、request、**kwargs):
如果db_field.name==“r_preducer”和hasattr(请求“报告对象”):
kwargs[“queryset”]=preducer.objects.filter(
行动区=请求报告行动区)
返回super(ReportAdmin,self).formfield\u for\u manytomy(
db_字段,请求,**kwargs)

'ReportAdmin'对象没有属性'obj'对不起,该钩子只能在内联中工作——请尝试更新的代码(注意,我还在第二个方法中添加了
getattr
),这对我根本不起作用。从未调用get_对象。据我所知,modeladmin的方法也没有文档化,这取决于您在哪里使用它(也许还有Django的版本)。您还可以在
get_form
get_formset
方法中进行尝试。请参阅my,以了解适用于内联的版本。DrMeers根据定义,您就是男人。让它与您的预编辑和使用get_表单相结合。这是一场多么激烈的斗争啊。谢谢你的帮助!
class ReportAdmin(admin.ModelAdmin):
    def get_object(self, request, object_id):
        # Hook obj for use in formfield_for_manytomany
        self.obj = super(ReportAdmin, self).get_object(request, object_id)
        print "Got object:", self.obj
        return self.obj

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "r_precursor" and getattr(self, 'obj', None):
            kwargs["queryset"] = Precursor.objects.filter(
                ops_area=self.obj.ops_area)
        return super(ReportAdmin, self).formfield_for_manytomany(
            db_field, request, **kwargs)