Pregunta de tipo de contenido de Django
-
06-07-2019 - |
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?
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