Subclassing the Page model is part of Mezzanine's API for creating content types, while the blog app is fairly stand-alone and not really designed to be customized outside of its templates. If all you wanted to do is add some fields and have them exposed in templates, subclassing would work.
Having said all that, I've been playing around with Django's class_created signal and it looks like if you time everything correctly, you can successfully inject fields onto an existing model without having to subclass it. The beauty of this is that you would avoid having a separate database table for your extra fields, and the performance penalty that would occur on the SQL JOINS when accessing those fields.
I haven't explored it fully but I have a working example (not integrated with Mezzanine, just a regular Django project) that looks like this:
* Create an empty app and ensure that it's the first app in the list of INSTALLED_APPS. Mezzanine does some messing around with the order of INSTALLED_APPS so I'm not sure if that's possible with Mezzanine in its current state. The order is important as the class_created signal handler needs to be registered before the models you wish to custom are set up by Django.
* In the empty app's __init__.py module, set up the signal handler as follows:
from django.db.models.signals import class_prepared
from django.db import models
def add_field(sender, **kwargs):
if sender.__name__ == "BlogPost":
custom_field = models.CharField(max_length=200)
custom_field.contribute_to_class(sender, "custom_field_name")
class_prepared.connect(add_field)
So with that set up as the first app, the signal handler will be run when Django loads each app in INSTALLED_APPS. We need to check the model name rather than importing the model outside of the handler and using it as the sender arg to the connect function, since importing it would then cause the model to be set up by Django prior to the signal handler being registered, and as such it would never be run for the model we're interested in.
Like I said I haven't fully explored this, but at first glance it looks like a much better approach than subclassing for customising models in libs outside of your project. One area where I think this might fall down is with South migrations, but it really needs more exploration.
If this does turn out to be a feasible approach to customising models in Mezzanine, what I might try and do is provide some hooks for specifying a mapping of custom fields to models you'd like to apply, and then have Mezzanine deal with the setup I described above. Anyone else have any thoughts on this?