Die Logik des Modells ist:Grenze Fremdschlüssel Entscheidungen in ausgewählten in einer Inline-Form in Admin
- A
Building
hat vieleRooms
- A
Room
innerhalb eines anderenRoom
(ein Schrank sein kann, zum Beispiel --ForeignKey auf ‚selbst‘) - A
Room
kann nur im gleichen Gebäude innerhalb eines anderenRoom
sein (dies ist der schwierige Teil)
ist der Code, ich habe:
#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
und:
#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)
Die Inline nur Zimmer im aktuellen Gebäude angezeigt wird (das ist, was ich will). Das Problem besteht jedoch darin, dass für das Drop-Down-Menü inside_room
alle Räume in der Rooms-Tabelle (einschließlich der in anderen Gebäuden) angezeigt werden.
Im inline von rooms
, ich brauche die inside_room
Entscheidungen nur rooms
zu begrenzen, die in dem aktuellen building
(das Gebäude Datensatz derzeit von der Haupt BuildingAdmin
Form verändert zu werden) sind.
Ich kann einen Weg weder mit einem limit_choices_to
in dem Modell, noch kann ich herausfinden, wie genau die Inline-Formularsatz des Admins richtig überschreiben (ich fühle mich wie ich irgendwie ein benutzerdefiniertes Inline-Formular erstellen sollte) Übergeben Sie die building_id des Hauptformulars an die benutzerdefinierte Inline-Datei, und begrenzen Sie dann das Abfrage-Set für die Auswahlmöglichkeiten des Felds auf dieser Grundlage - aber ich kann einfach nicht sagen, wie es geht.
Vielleicht ist das zu komplex für die Admin-Seite, aber es scheint wie etwas, das allgemein nützlich wäre ...
Das hier hat mir eine Menge Ärger erspart. Ich musste Auswahlmöglichkeiten filtern, aber nach einer Sitzungsvariablen. Diese Antwort lässt mich mit 5 Zeilen Code machen. Vielen Dank. –
Danke eine Million! Eine Alternative ist die Zuweisung von kwargs ['queryset'] vor dem Aufruf von super wie in Dokument: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey – powlo
Code hat mir auch viel Zeit gespart. Vielen Dank für das Posten dieses – fangsterr