Je crée un CMS simple en django, avec plusieurs "modules" (chacun en tant qu'application django). J'ai mis en place les modèles suivants:Héritage Django et Permaliens
class FooObject(models.Model):
id = models.SlugField(primary_key=True)
name = models.CharField(max_length=255)
creator = models.ForeignKey(auth.models.User, editable=False, related_name="createdby")
class FooPage(FooObject):
content = models.TextField(blank=True, null=True)
@models.permalink
def get_absolute_url(self):
return ('page',(), {'page_id':self.id}
class FooSubitem(FooObject):
parent = models.ForeignKey(FooPage, related_name='subitems')
, je crée dans chacun des modules une sous-classe de FooPage, et au moins une sous-classe de FooSubitem, par exemple
# in FooBlog.models
class FooBlog(FooPage):
owner = models.ForeignKey(auth.models.User, editable=False)
@models.permalink
def get_absolute_url(self):
return ('blog',(), {'blog_id':self.id})
class FooPost(FooSubitem):
post_time = models.DateTimeField(auto_now_add=True)
et
# in FooGallery.models
class FooGallery(FooPage):
location = models.CharField(max_length=255)
@models.permalink
def get_absolute_url(self):
return ('gallery',(), {'gallery_id':self.id})
class FooImage(FooSubitem):
image_file = models.ImageField(upload_to='foogallery')
Ce sont des simplifications, mais devrait vous donner une bonne idée de ce que je suis en train de faire. Dans les admins pour FooPost et FooImage, je restreindre la liste de sélection parente à leurs pages parentes correspondantes.
Mon problème se pose lorsque j'essaie de les utiliser dans un modèle. Dans chaque vue, je donne les résultats suivants:
page_list = FooPage.objects.all()
qui retourne une liste de tous les FooPages, des deux types FooBlog et FooGallery. Cependant, quand j'itérer cette liste:
{% for page in page_list %}{{ page.get_absolute_url }}{% endfor %}
retourne le modèle url « page », pas le modèle url « blog » ou « galerie ».
Comment est-ce que je fais ce travail sans avoir à réécrire le code quand je veux ajouter un module FooCalendar plus tard? Je veux m'assurer que cela fonctionne avec n'importe quel module possible.
Merci,
- Lexo
Il est étrange que cela n'utilise pas la fonction de sous-classes pour retourner l'URL (Il ne retourne FooBlog et FooGallery dans la liste, à droite) .. vous devrez peut-être définir les classes 'FooBlog' et' FooGallery' en tant que modèles de proxy.Les modèles de proxy sont utilisés lorsque vous conservez la même base de données pour les modèles, mais vous souhaitez ajuster certaines choses comme la commande, et peut-être la fonctionnalité 'get_absolute_url'. Vérifiez-les: http://docs.djangoproject.com/fr/1.2/topics/db/models/#id8 - Faites-moi savoir si cela fonctionne pour vous. – Bartek
Merci pour l'info. Je vais regarder dans les modèles de proxy. – Lexo
Je ne pense pas que les modèles de proxy sont ce dont j'ai besoin. Les sous-classes individuelles telles que FooImage doivent être associées à des champs supplémentaires. Les classes abstraites seraient parfaites, mais j'ai besoin de la relation parent/enfant entre FooPages et FooSubitems pour être là, et vous ne pouvez pas spécifier de clés étrangères sur les classes abstraites. – Lexo