Models
Abstract base classes provided by prefab.models, available to all Prefab apps and project models.
PrefabModel
Base for all Prefab models. Provides:
__str__— returnsname,title, or the default Django reprmeta_titleproperty — returnsstr(self)urlproperty — alias forget_absolute_url()get_admin_url()— returns the Django admin change URL for the instance- Sets
self.is_createdbefore each save (useful inpost_savesignals)
from prefab.models import PrefabModel
class Article(PrefabModel):
name = models.CharField(max_length=255)
def get_absolute_url(self):
return reverse('article-detail', args=[self.pk])
article = Article.objects.first()
article.url # same as article.get_absolute_url()
article.get_admin_url() # '/admin/blog/article/1/change/'TimeStampedModel
Extends PrefabModel. Adds:
date_created— set on first savedate_modified— updated on every subsequent save- Default ordering:
-date_created
from prefab.models import TimeStampedModel
class Post(TimeStampedModel):
title = models.CharField(max_length=255)
post = Post.objects.first()
post.date_created # datetime of first save
post.date_modified # datetime of last saveUserTimeStampedModel
Extends TimeStampedModel. Adds:
user_created— FK toAUTH_USER_MODEL, set at creationuser_modified— FK toAUTH_USER_MODEL, updated on savecreated/modifiedproperties — formatted strings including the user's name
from prefab.models import UserTimeStampedModel
class Document(UserTimeStampedModel):
title = models.CharField(max_length=255)
doc = Document.objects.first()
doc.created # e.g. '2024-01-01 by John Doe'
doc.modified # e.g. '2024-06-15 by Jane Doe'OrderableModel
Extends PrefabModel. Adds:
position— integer for manual ordering- Auto-assigns
max(position) + 1on creation - Default ordering:
position
from prefab.models import OrderableModel
class MenuItem(OrderableModel):
name = models.CharField(max_length=255)
# Items are returned in position order by default
MenuItems.objects.all() # ordered by positionUUIDModel
Adds a UUID primary key (uuid) with an id property alias. Useful when you want UUIDs as PKs without using integers.
from prefab.models import UUIDModel
class Token(UUIDModel):
name = models.CharField(max_length=255)
token = Token.objects.first()
str(token.pk) # 'a1b2c3d4-...'
token.id # alias for token.uuidHierarchicalModel
Extends MPTTModel + PrefabModel. Adds a self-referential parent tree FK for MPTT-based hierarchies.
from prefab.models import HierarchicalModel
class Category(HierarchicalModel):
name = models.CharField(max_length=255)
category = Category.objects.first()
category.get_ancestors() # MPTT queryset of parent nodes
category.get_descendants() # MPTT queryset of child nodesSlugModel / SlugMixin
Adds a slug field (always lowercased). Auto-derives the slug from name or title on first save using slugify.
from prefab.models import SlugModel
class Tag(SlugModel):
name = models.CharField(max_length=255)
tag = Tag.objects.create(name='Hello World')
tag.slug # 'hello-world'SlugsMixin
For hierarchical models that need a full path slug (e.g. parent-slug/child-slug). Saves a concatenated path to slugs. Call save(update_slugs=True, update_slugs_descendants=True) to rebuild the full tree.
from prefab.models import HierarchicalModel, SlugsMixin
class Page(SlugsMixin, HierarchicalModel):
name = models.CharField(max_length=255)
page = Page.objects.get(name='Child')
page.slugs # 'parent-page/child'SocialModel
Adds social platform handle fields for 20+ networks (Twitter, LinkedIn, Facebook, Instagram, GitHub, etc.) with helper methods to build profile URLs. Automatically normalizes pasted URLs to just the handle on save.
from prefab.models import SocialModel
class Profile(SocialModel):
name = models.CharField(max_length=255)
# Pasting a full URL normalizes to just the handle on save
profile.twitter = 'https://twitter.com/django'
profile.save()
profile.twitter # 'django'AdjectiveMixin / SubjectMixin / ContentQualityMixin
Smaller mixins for adding adjective, subject/grammatical gender, and content quality classification fields.
from prefab.models import TimeStampedModel, ContentQualityMixin
class Article(ContentQualityMixin, TimeStampedModel):
title = models.CharField(max_length=255)