Mon désir est d'avoir un modèle d'emplacement commun, puis de faire référence aux différents modèles de niveau supérieur qui ont besoin d'un emplacement.Django Admin Inline et Schema Design
Je souhaite présenter mon utilisateur à l'administrateur avec un formulaire à plusieurs parties (une ligne) qui lui permet d'entrer les informations de niveau supérieur pour l'éditeur et le bâtiment, ainsi que les informations d'emplacement pour chacun. Le système en ligne ne semble pas vouloir fonctionner de cette façon. De toute évidence, je fais quelque chose de très mal, parce que cela me semble être un problème très standard. Est-ce que ma conception de schéma est borked? Est-ce que j'utilise stupidement le système inline? Je ne veux pas faire des sous-classes de Location pour chaque objet de niveau supérieur, parce que je veux manipuler des emplacements de manière différente indépendamment des objets de haut niveau qui les possèdent (une liste de diffusion ou une recherche géographique peut-être)
models.py:
...
class Location(models.Model):
"""
A geographical address
"""
# Standard Location stuff
address_line1 = models.CharField("Address line 1", max_length = 45, null=True, blank=True)
...
class Publisher(models.Model):
"""
Contains Publisher information for publishers of yearbooks. Replaces Institution from 1.x
"""
name = models.CharField(max_length=100, null=False, help_text="Name of publisher, e.g. University of Kansas")
groups = models.ManyToManyField(Group, help_text="Select groups that this publisher owns. Usually just one, but multiple groups are possible.")
is_active = models.BooleanField(help_text="Check this box to enable this publisher.")
location = models.OneToOneField(Location)
...
class Building(models.Model):
"""
Contains Building Information
"""
name = models.CharField(max_length=100, null=False, help_text="Name of building, e.g. Physical Sciences")
is_active = models.BooleanField(help_text="Check this box to enable this building.")
location = models.OneToOneField(Location)
...
admin.py:
...
class LocationInline(generic.GenericStackedInline):
model = Location
max_num = 1
extra = 1
class PublisherAdmin(admin.ModelAdmin):
model = Publisher
inlines = [ LocationInline,
]
class BuildingAdmin(admin.ModelAdmin):
model = Building
inlines = [ LocationInline,
]
admin.site.register(Publisher, PublisherAdmin)
admin.site.register(Building, BuildingAdmin)
Je peux forcer la ligne à charger et présente en ajoutant ceci au modèle Lieu:
# Support reverse lookup for admin
object_id = models.PositiveIntegerField()
content_type = models.ForeignKey(ContentType)
of = generic.GenericForeignKey('content_type', 'object_id')
Mais quand je fais cela, même si je reçois un objet en ligne, et peut le modifier, la relation semble en arrière pour moi, avec Location stockant un identifiant à l'objet qui l'a créé.
Toute aide est la bienvenue, soit un changement de schéma recommandé pour que tout fonctionne à merveille (comme Django le fait si bien) ou une astuce pour rendre le truc apparemment rétrograde logique.
Voilà ce qui me manquait Greg. La notion d'attacher _itself_ à un autre objet, sans que l'objet 'parent' ait une quelconque conscience. Mon champ OneToOne est superflu dans cette situation. Je l'ai. Je vous remercie. –