Как добавить двунаправленные многие поля в админке django? - PullRequest
11 голосов
/ 27 августа 2009

В моем models.py у меня есть что-то вроде:

class LocationGroup(models.Model):
    name = models.CharField(max_length=200)

class Report(models.Model):
    name = models.CharField(max_length=200)
    locationgroups = models.ManyToManyField(LocationGroup)

admin.py (стандартный):

admin.site.register(LocationGroup)
admin.site.register(Report)

Когда я вхожу на страницу администратора для отчета, он показывает красивое поле с несколькими вариантами. Как добавить одно и то же поле множественного выбора в LocationGroup? Я могу получить доступ ко всем отчетам, вызвав LocationGroup.report_set.all ()

Ответы [ 3 ]

8 голосов
/ 21 сентября 2009

Обходной путь, который я нашел, состоял в том, чтобы следовать инструкциям для ManyToManyFields с промежуточными моделями . Даже если вы не используете функцию сквозной модели, просто сделайте вид, как если бы вы были, и создайте модель заглушки с необходимым ForeignKey.

# models:  make sure the naming convention matches what ManyToManyField would create
class Report_LocationGroups(models.Model):
    locationgroup = models.ForeignKey(LocationGroup)
    report = models.ForeignKey(Report)

# admin
class ReportInline(admin.TabularInline):
    model = models.Report_LocationGroups

class LocationGroupAdmin(admin.ModelAdmin):
    inlines = ReportInline,
2 голосов
/ 27 августа 2009

Я думаю, что вы можете объединить этот пример кода ( исходный ), который нарушает sync_db

class ItemType(meta.Model):
    name = meta.CharField(maxlength=100)
    description = meta.CharField(maxlength=250)
    properties = meta.ManyToManyField('PropertyType',
            db_table='app_propertytype_itemtypes')

class PropertyType(meta.Model):
    name = meta.CharField(maxlength=100)
    itemtypes = meta.ManyToManyField(ItemType)

с этим фрагментом

class ManyToManyField_NoSyncdb(models.ManyToManyField):
    def __init__(self, *args, **kwargs):
        super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs)
       self.creates_table = False

чтобы получить что-то вроде

class ItemType(meta.Model):
    name = meta.CharField(maxlength=100)
    description = meta.CharField(maxlength=250)
    properties = meta.ManyToManyField_NoSyncdb('PropertyType',
            db_table='app_propertytype_itemtypes')

class PropertyType(meta.Model):
    name = meta.CharField(maxlength=100)
    itemtypes = meta.ManyToManyField(ItemType)

Отказ от ответственности : это просто грубая идея

Редактировать: Вероятно, есть какое-то отношение к Прокси-моделям Django 1.1

1 голос
/ 03 сентября 2009

Я думаю, что вы ищете админские строки . В вашем admin.py вы захотите добавить что-то вроде этого:

class LocationGroupInline(admin.TabularInline):
    model = LocationGroup

class ReportAdmin(admin.ModelAdmin):
    inlines = [ LocationGroupInline, ]
admin.site.register(Report, ReportAdmin)
admin.site.register(LocationGroup)

Существует много опций, которые нужно включить в LocationGroupInline, если вы хотите дополнительно настроить встроенное отображение связанной модели. Два из этих параметров: form и formset , что позволит вам использовать пользовательские классы Django Form и FormSet для дальнейшей настройки внешнего вида встроенного администратора модели. Используя это, вы можете создать простую форму, которая отображает только то поле с несколькими вариантами выбора, которое вы хотите (за исключением поля M2M, его будет невозможно отобразить как один выпадающий список, а как поле с несколькими вариантами выбора). Например:

class MyLocationGroupForm(forms.Form):
    location = forms.MultipleModelChoiceField(
           queryset=LocationGroup.objects.all())

class LocationGroupInline(admin.TabularInline):
    model = LocationGroup
    form = MyLocationGroupForm
...