问题 如何在django admin中添加双向manytomanyfields?


在我的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)

当我进入Report的管理页面时,它会显示一个很好的多选字段。如何在LocationGroup中添加相同的多选字段?我可以通过调用LocationGroup.report_set.all()来访问所有报告


5103
2017-08-27 07:31


起源

相关票证: code.djangoproject.com/ticket/897 - guettli


答案:


我找到的解决方法是按照说明进行操作 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,

8
2017-09-20 22:29



看起来是相对最简单的实现,thx! - Jack Ha
最容易,但仍然是一个黑客。我希望Django能以更优雅的方式支持这一点。 - Yuval Adam


我想你可以结合这个示例代码(资源)这打破了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
2017-08-27 11:55





我觉得你在寻找的是什么 管理员内联。在您的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
2017-09-02 21:56



报告管理员默认会内联LocationGroups,问题是如何反向操作。无论如何,这将引发一个异常,即LocationGroup没有对ReportAdmin的ForeignKey。 - A. Coady