La lógica es del modelo es:limitar las opciones de clave externa en selecto en un formulario en línea en el administrador
- Un
Building
tiene muchasRooms
- Un
Room
puede haber dentro de otroRoom
(un armario, por ejemplo, --ForeignKey en 'auto') - Un
Room
sólo puede ser dentro de otroRoom
en el mismo edificio (esta es la parte difícil)
Aquí está el código que tengo:
#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
y:
#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)
La línea mostrará sólo las habitaciones en el edificio actual (que es lo que quiero). El problema, sin embargo, es que para el menú desplegable inside_room
, muestra todas las salas de la tabla Salas (incluidas las de otros edificios).
En la línea de rooms
, tengo que limitar las opciones a inside_room
única rooms
que están en la corriente building
(el registro edificio que actualmente está alterado por la forma principal BuildingAdmin
).
No puedo encontrar una manera de hacerlo con un limit_choices_to
en el modelo, ni puedo averiguar cómo sobrescribir exactamente el formset en línea del administrador (creo que debería crear de alguna manera una forma personalizada en línea) , pase el building_id del formulario principal a la línea personalizada, luego limite el conjunto de preguntas para las elecciones del campo en función de eso, pero no puedo entender cómo hacerlo).
Tal vez esto es demasiado complejo para el sitio de administración, pero parece que algo que sería útil en general ...
Esto me salvó muchas molestias. Necesitaba filtrar elecciones, pero por una variable de sesión. Esta respuesta me permite hacerlo con 5 líneas de código. Gracias. –
¡Gracias a un millón! Una alternativa es asignar kwargs [ ''] QuerySet antes de llamar a super según docs: Esta https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey – powlo
código también me ahorró TONELADAS de tiempo. Muchas gracias por publicar este – fangsterr