如何在带有ManyToMany关系的可编辑字段上使用TabularInline?
我的模型包含多对多的关系。 Measurements
可以是任意数量的DataSets
。
# models.py
from django.db import models
class DataSet(models.Model):
purpose = models.TextField()
class Measurement(models.Model):
value = models.IntegerField()
sets = models.ManyToManyField(DataSet, null=True, blank=True,
verbose_name="datasets this measurement appears in")
我想要我的管理界面在DataSet
管理中内联Measurement
字段,例如TabularInline
如何与ForeignKey
字段配合使用。 这是我到目前为止:
# admin.py
from django.contrib import admin
from myapp.models import Measurement, DataSet
class MeasurementInline(admin.TabularInline):
model = Measurement.sets.through
class DataSetAdmin(admin.ModelAdmin):
inlines = [MeasurementInline]
admin.site.register(DataSet, DataSetAdmin)
不幸的是,我所得到的都是带有“+”按钮的下拉框,它们打开了测量管理员。 我希望将实际的“测量”字段value
暴露在内联中。 我尝试将value
添加到MeasurementInline上的字段列表中:
# admin.py
class MeasurementInline(admin.TabularInline):
model = Measurement.sets.through
fields = ['value']
但是这给了我一个错误: 'MeasurementInline.fields' refers to field 'value' that is missing from the form.
。
如何在DataSet
admin中显示Measurement
可编辑字段?
注:这是一个简化的案例; 我的真实案例在其Measurement
模型中有很多领域。 如果使用管理界面的人不得不打开一个输入数据的新窗口,尤其是因为他们需要在域之间进行一些复制和粘贴,这将是非常乏味的。
即使在我的现实世界的模型,数据我想用户编辑直列没有描述之间的关系DataSet
和Measurement
-只有Measurement
本身。 我相信这会使中介模式不适合我的目的。
简短的回答:你不能。
漫长的回答:你不能没有显着编辑django的ModelAdmin。 它使用的InlineFormset工厂极其有限,目前无法处理ManyToManyInlines。 InlineModelAdmin对象仅受ForeignKeys支持。
抱歉。
那么,不确定要真正理解您正在处理的项目,但是如果您想在数据集中使用Measurement inlines
,则可能需要将关系放入数据集模型中:
class DataSet(models.Model):
purpose = models.TextField()
measurements = models.ManyToManyField(DataSet, null=True, blank=True)
class Measurement(models.Model):
value = models.IntegerField()
而在你的admin.py中,只需:
class MeasurementInline(admin.TabularInline):
model = Measurement
class DataSetAdmin(admin.ModelAdmin):
inlines = [MeasurementInline]
admin.site.register(DataSet, DataSetAdmin)
使用model = Measurement.sets.through
对我来说看起来很奇怪,但也许我完全错过了这一点?
上一篇: How do I use a TabularInline with editable fields on a ManyToMany relationship?