Django 如何为“def formfield”for“u manytomany”提供可编辑对象的id
我如何才能为多个的def formfield\u提供可编辑对象的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
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)