Logic của mô hình là:
- A
Building
có nhiềuRooms
- A
Room
có thể ở bên trong cái khácRoom
(ví dụ: một tủ quần áo - ForeignKey trên 'self') - A
Room
chỉ có thể ở bênRoom
trong một tòa nhà khác trong cùng một tòa nhà (đây là phần khó khăn)
Đây là mã tôi có:
#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
và:
#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)
Nội tuyến sẽ chỉ hiển thị các phòng trong tòa nhà hiện tại (đó là những gì tôi muốn). Tuy nhiên, vấn đề là đối với trình đơn inside_room
thả xuống, nó hiển thị tất cả các phòng trong bảng Phòng (bao gồm cả những phòng trong các tòa nhà khác).
Trong dòng nội tuyến của rooms
, tôi cần giới hạn các inside_room
lựa chọn chỉ rooms
trong hiện tại building
(hồ sơ tòa nhà hiện đang được thay đổi bởi BuildingAdmin
biểu mẫu chính ).
Tôi không thể tìm ra cách để làm điều đó với một limit_choices_to
trong mô hình, cũng như không thể tìm ra cách chính xác để ghi đè bộ định dạng nội tuyến của quản trị viên một cách chính xác (tôi cảm thấy như bằng cách nào đó tôi nên tạo một biểu mẫu nội tuyến tùy chỉnh, chuyển building_id của biểu mẫu chính cho dòng nội tuyến tùy chỉnh, sau đó giới hạn bộ truy vấn cho các lựa chọn của trường dựa trên đó - nhưng tôi không thể hiểu cách thực hiện).
Có thể điều này quá phức tạp đối với trang quản trị, nhưng có vẻ như điều gì đó nói chung sẽ hữu ích ...