La logique est du modèle est :
- A
Building
a beaucoupRooms
- A
Room
peut être à l'intérieur d'un autreRoom
(un placard, par exemple--ForeignKey sur 'self') - A
Room
ne peut être qu'à l'intérieur d'un autreRoom
dans le même bâtiment (c'est la partie la plus délicate)
Voici le code que j'ai :
#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
et :
#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)
L'affichage en ligne n'affichera que les pièces du bâtiment actuel (ce qui est ce que je veux). Le problème, cependant, est que pour le inside_room
il affiche toutes les pièces de la table Pièces (y compris celles des autres bâtiments).
Dans l'inline de rooms
j'ai besoin de limiter les inside_room
de choisir uniquement rooms
qui sont dans le courant building
(le dossier du bâtiment est actuellement en cours de modification par le principal BuildingAdmin
).
Je n'arrive pas à trouver un moyen de le faire avec un limit_choices_to
dans le modèle, et je n'arrive pas non plus à comprendre comment remplacer correctement le jeu de formulaires en ligne de l'administrateur (j'ai l'impression que je devrais créer un formulaire en ligne personnalisé, passer le building_id du formulaire principal au formulaire en ligne personnalisé, puis limiter le jeu de questions pour les choix du champ en fonction de cela - mais je n'arrive pas à comprendre comment le faire).
Peut-être que c'est trop complexe pour le site d'administration, mais cela semble être quelque chose qui serait généralement utile...