I have an "Entry" model, containing one GenericForeignKey:
class Entry(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
And diffentent content models like "Note" and "File":
class Note(models.Model):
title = models.CharField(max_length=255)
text = models.TextField()
class File(models.Model):
title = models.CharField(max_length=255)
file_field = models.FileField('File', upload_to='files')
description = models.TextField(blank=True)
If they are stored, a new "Entry" is automatically created, so I can list all contents by:
Entry.objects.all()
Now I'm searching a way to write a view and a template, which should list all Entrys AND their details, in arbitrary order (for example by date). How can this be done?
Is it possible to associate partial templates to specific models? How does the template know how to display a specific instance within a list?
The whole and not simplified models.py looks like this:
from django.db.models.signals import post_save, pre_delete
import datetime
class Entry(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
def title(self):
return self.content_object.title
def __unicode__(self):
return self.title()
class DateModel(models.Model):
""" A model for basic date awareness """
modified_date = models.DateTimeField(blank=True, null=True)
created_date = models.DateTimeField(blank=True)
class Meta:
abstract = True
ordering = ['-created_date']
def save(self, *args, **kwargs):
if not self.pk:
self.created_date = datetime.datetime.now()
else:
self.modified_date = datetime.datetime.now()
return super(DateModel, self).save(*args, **kwargs)
class Tag(DateModel):
name = models.CharField(max_length=51, unique=True)
def __unicode__(self):
return self.name
class Notebook(models.Model):
name = models.CharField(max_length=50, unique=True)
description = models.TextField(blank=True)
def __unicode__(self):
return self.name
class EntryModel(DateModel):
"""All Entry models are inherited from this abstract class"""
title = models.CharField(max_length=255)
notebook = models.ForeignKey(Notebook, blank=True, null=True)
tags = models.ManyToManyField(Tag, blank=True, null=True)
class Meta:
abstract = True
def __unicode__(self):
return self.title
######## Begin: Entry Classes ########
class Memo(EntryModel):
text = models.TextField()
def save(self, *args, **kwargs):
if self.title == '-' or self.title == '':
if len(self.text) > 20:
self.title = self.text[:17]+'...'
else:
self.title = self.text
return super(EntryModel, self).save(*args, **kwargs)
class File(EntryModel):
file_field = models.FileField('File', upload_to='files')
description = models.TextField(blank=True)
######## End: Entry Classes ########
def create_entry(sender, **kwargs):
"""Handler for post_save signal to create new Entry"""
if 'created' in kwargs:
if kwargs['created']:
instance = kwargs['instance']
ctype = ContentType.objects.get_for_model(instance)
entry = Entry.objects.get_or_create(
content_type=ctype,
object_id=instance.id)
def delete_entry(sender, **kwargs):
"""Handler for pre_delete signal to delete related Entry"""
instance = kwargs['instance']
ctype = ContentType.objects.get_for_model(instance)
entry = Entry.objects.get(
content_type=ctype,
object_id=instance.id)
entry.delete()
# Connect handler to post_save signal
entry_classes = EntryModel.__subclasses__()
for cls in entry_classes:
post_save.connect(create_entry, sender=cls)
pre_delete.connect(delete_entry, sender=cls)