在我的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()
来访问所有报告答案 0 :(得分:8)
我找到的解决方法是遵循ManyToManyFields with intermediary models的说明。即使您没有使用“直通”模型功能,也只是假装自己,并使用必要的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,
答案 1 :(得分:2)
我认为你可以结合这个示例代码(source)来打破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)
免责声明:这只是一个粗略的想法
有关答案 2 :(得分:1)
我认为你在寻找的是admin inlines。在您的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