Pregunta

Tengo un problema al vincular el tipo de contenido. Estoy tratando de sacar un título de este modelo

class TankProfile(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=100)
    tank_type = models.SmallIntegerField(max_length=1, choices=TANK_TYPE, db_index=True, default=1, verbose_name="Tank Type")
    ts = models.DateTimeField(auto_now=True)
    tsStart = models.DateTimeField(auto_now_add=True)
    tsEnd = models.DateTimeField(null=True, auto_now=False, blank=True)
    pic = models.CharField(max_length=25)
    slug = models.CharField(max_length=100)

    def __unicode__(self):
        return str(self.title)

    def get_title(self):
        return "%s" % self.title

Mi modelo de enlace es el siguiente que usa contenttype

class Photo(models.Model):
    album = models.ForeignKey(Album)
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType, related_name="content_type_set_for_%(class)s")
    object_pk = models.IntegerField(_('object ID'))
    server = models.CharField(max_length=20)
    dir = models.CharField(max_length=20)
    image = models.CharField(max_length=20)
    added = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=150)
    about = models.TextField()


    def get_root_title(self):

        c = ContentType.objects.get(id=self.content_type.id).model_class()
        print c.title

        return "Photos"

    def __unicode__(self):
        return str(self.id)

En la plantilla cuando llamo

{{photo.get_root_title}}

No aparece nada ... y nada se imprime ... ¿qué estoy haciendo mal?

¿Fue útil?

Solución

Su c es un objeto de clase, no tiene un atributo title .

Lo que desea es un objeto al que se haga referencia tanto por content_type como object_id : esto es lo que en realidad se llama relación genérica , como se describe en los documentos de Django . Para usarlo, agregue el FK a su clase Photo :

content_object = generic.GenericForeignKey('content_type', 'object_id')

entonces puedes usar esta propiedad en tu plantilla usando solo {{photo.content_object.title}} .

Otros consejos

No sé por qué elegiste específicamente la definición get_root_title, pero normalmente con el ORM de django lo haría así

{{ photo.content_type.title }}

y obtienes fácilmente el título

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top