如何在带有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模型中有很多领域。 如果使用管理界面的人不得不打开一个输入数据的新窗口,尤其是因为他们需要在域之间进行一些复制和粘贴,这将是非常乏味的。

即使在我的现实世界的模型,数据我想用户编辑直列没有描述之间的关系DataSetMeasurement -只有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对我来说看起来很奇怪,但也许我完全错过了这一点?

链接地址: http://www.djcxy.com/p/52265.html

上一篇: How do I use a TabularInline with editable fields on a ManyToMany relationship?

下一篇: Idiomatic haskell for database abstraction