这种模式的逻辑是:
Building
有许多 Rooms
Room
可能在另一个 Room
里面(例如,一个壁橱——“ self”上的 ForeignKey)Room
只能在同一栋楼里的另一个 Room
里面(这是比较棘手的部分)我的密码是这样的:
#spaces/models.py
from django.db import models
class Building(models.Model):
name=models.CharField(max_length=32)
def __unicode__(self):
return self.name
class Room(models.Model):
number=models.CharField(max_length=8)
building=models.ForeignKey(Building)
inside_room=models.ForeignKey('self',blank=True,null=True)
def __unicode__(self):
return self.number
以及:
#spaces/admin.py
from ex.spaces.models import Building, Room
from django.contrib import admin
class RoomAdmin(admin.ModelAdmin):
pass
class RoomInline(admin.TabularInline):
model = Room
extra = 2
class BuildingAdmin(admin.ModelAdmin):
inlines=[RoomInline]
admin.site.register(Building, BuildingAdmin)
admin.site.register(Room)
内联将只显示当前大楼中的房间(这是我想要的)。但问题是,对于 inside_room
下拉列表,它显示 Rooms 表中的所有房间(包括其他建筑中的房间)。
在内联的 rooms
,我需要限制的 inside_room
选择只有 rooms
是在当前的 building
(建筑记录目前正在改变的主要 BuildingAdmin
形式)。
我不能找到一种方法来做到这一点,无论是在模型中的 limit_choices_to
,也不能弄清楚如何确切覆盖管理员的内联格式集正确(我觉得我应该以某种方式创建一个自定义内联表单,传递主表单的 build _ id 到自定义内联表单,然后限制查询集为字段的选择基于这一点-但我只是不能理解如何做到这一点)。
也许这对于管理站点来说太复杂了,但它似乎是一些通常有用的东西..。