Как добавить двунаправленные manytomanyfields в django администраторе?

Я думаю, что ответ Asa чрезвычайно корректен, но Вы могли расширить его немного для действия больше как mkdir -p, также:

import os

def mkdir_path(path):
    if not os.access(path, os.F_OK):
        os.mkdirs(path)

или

import os
import errno

def mkdir_path(path):
    try:
        os.mkdirs(path)
    except os.error, e:
        if e.errno != errno.EEXIST:
            raise

они оба обрабатывают случай, где путь уже существует тихо, но позвольте другому ошибочному пузырю.

11
задан Jack Ha 27 August 2009 в 07:31
поделиться

3 ответа

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

# 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,
8
ответ дан 3 December 2019 в 09:42
поделиться

Я думаю, вы можете объединить этот пример кода ( исходный код ), который нарушает 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

2
ответ дан 3 December 2019 в 09:42
поделиться

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

class LocationGroupInline(admin.TabularInline):
    model = LocationGroup

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

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

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

class LocationGroupInline(admin.TabularInline):
    model = LocationGroup
    form = MyLocationGroupForm
1
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: