tutorial - load tags django
Confundido sobre ContentType (1)
Supongamos que este es un modelo para la foto de un usuario:
class Photo(models.Model):
user = models.ForeignKey(User)
title = models.CharField()
image = models.ImageField()
pub_date = models.DateTimeFied(auto_now=True, auto_now_add=pub_date)
update = models.DateTimeFied(auto_now=False, auto_now_add=True)
Este es otro modelo para el estado del usuario:
class Status(models.Model):
user = models.ForeignKey(User)
tweet = models.TextFied()
pub_date = models.DateTimeFied(auto_now=True, auto_now_add=pub_date)
Ahora, este es un modelo para todos los feeds de un usuario:
class StreamItem(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey(''content_type'',''object_id'')
En la clase anterior StreamItem , ¿el
content_type
será el tipo_datos de la instancia?¿Qué es
object_id
? ¿Es el pk de la instancia decontent_type
o el pk para esa instancia de StreamItem?¿Cómo obtengo la
pub_date
de la instanciacontent_type
(Photo and Status) y la inicializo en la instancia de StreamItem?Por último, ¿cómo lo renderizo en la plantilla? Porque no sé si es un texto o una imagen.
Gracias.
Esta es una respuesta realmente rápida:
1) content_type será el tipo de objeto (foto o estado en su caso); consulte el marco de contenido de Django para obtener más información sobre cómo funciona.
2) object_id será la clave principal de la foto o el estado
3) Para acceder a las propiedades del genérico, acceda a ellas a través de su propiedad content_object
stream_item.content_object.pub_date
4) Haría un método en cada modelo para la forma en que lo desea. Esto podría usarse junto con el sistema de plantillas de Python. Nombra los métodos de la misma manera que puedes llamarlo como una interfaz.
class Status(models.Model):
...
def render_widget(self):
return render_to_string(''status_widget.html'', {''status'' : self })
class Photo(models.Model):
...
def render_widget(self):
return ''<span>My HTML Here</span>''
Para usar en tu plantilla:
{% for item in stream_items %}
{{ item.content_object.render_widget }}
{% endfor %}