Как использовать TabularInline с редактируемыми полями в отношении ManyToMany? - PullRequest
7 голосов
/ 27 апреля 2011

Мои модели содержат отношение многие ко многим. 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")

Я хочу, чтобы в моем интерфейсе администратора были встроенные поля Measurement в администраторе DataSet, например, как 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..

Как открыть редактируемые поля для Measurement в DataSet admin?

Примечания: Это упрощенный случай; В моем реальном случае в его модели Measurement много полей. Было бы ужасно утомительно, если бы людям, использующим интерфейс администратора, пришлось открывать новое окно для ввода данных, особенно потому, что им также нужно было бы выполнить некоторое копирование и вставку между полями.

Даже в моих реальных моделях данные, которые я хочу, чтобы пользователи редактировали inline, НЕ описывают отношения между DataSet и Measurement - только сама Measurement. Я считаю, что это делает посредническую модель непригодной для моих целей.

Ответы [ 2 ]

5 голосов
/ 21 февраля 2013

Краткий ответ: вы не можете.

Длинный ответ: вы не можете без значительного редактирования ModelAdmin в django. Используемые им фабрики InlineFormset чрезвычайно ограничены и в настоящее время не могут обрабатывать ManyToManyInlines. InlineModelAdmin объекты только поддерживаются с ForeignKeys.

Извините.

0 голосов
/ 11 декабря 2011

Ну, конечно, вы не понимаете, над каким проектом вы работаете, но если вы хотите измерение 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 выглядит странно для меня. Но, может быть, я полностью упустил суть?

...