Last update on .

This blog got a neglected over the past few months. Like most people, I have a lot going on. Though I have many ideas for articles, I haven't taken the time to post. Since I have been writing more for work and need a place to share that content, I decided it is time to get this blog back in working order. It has been a lot of work, but I'm happy with the result.

My blog has always been as much about learning web programming as it has been about writing useful content. I have tried a few Django blogs over the years, and I have always been very impressed with them until the author moved on to another platform and was left maintaining the system on my own. As much as it pains me to be jealous of Wordpress users, my life is now too busy for these types of hobby projects. Sometimes I think I need a blog that "just works" even if it is written in PHP. I learned a lot from my previous blogging engines, but now I need something that will continue working.

The Django framework has impressed me as the type of programming project where I feel that I get smarter every day I use it; it steeps me in best practices and elegant pattens. I have also been impressed with the high quality of modules. But the community is still a relatively small community and modules are competing for enough mass be viable over the long term. After spending a year working with a team that standardized on another web framework, it is nice to see that the Django community is maturing quickly. I am glad to see that there are multiple options for a Django blog with more than ten users. I thought about using a full-blown CMS since there are now two very mature projects with thousands of users: FeinCMS, Django-CMS (with cmsplugin-blog), and Pinax. But a dedicated blog engine seems to be much easier to setup and maintain. Both Zinnia and Mezzanine appear to be feature complete and have active communities so I expect that they will be well maintained for many years to come.

When it was a new project I briefly evaluated Mezzanine, but Byteflow had more features at the time (I am sure there is an interesting lesson to be drawn from that). The key feature that kept me from Mezzanine this time is that it does not support Pingbacks. Since Byteflow supported pingbacks, I have a few in my database that I didn't want to lose. Zinnia does not support General Pages (which I assume means pages which are not part of the actual blog), though Mezzanine does. That isn't ideal, but is easy to work-around. I also like that Zinnia can integrate with Django-CMS if I ever want to use it on a more complex site and the ability to export from Zinnia to WordPress gives me a nice comfortable feeling though I hope to never have to use that escape hatch.

I didn't plan on leaving Byteflow. The migration process started with me spending a half day trying to get Byteflow upgraded to Django 1.4. I think I was really close, and the Byteflow author gave me a key hint the day after I abandoned the effort. I spent an hour researching options, picked Zinnia, and dove in. I had my new blog running before I went to bed. It took me another half day to write a migration script to get all of my data moved. Even though there are not many Byteflow users who will need it, I hope that the documentation of the database tables proves helpful to people. I spent another day theming the new plog, doing general cleanup, and adding new content. Two and a half days, no data loss, and no broken URLs makes me very happy with the project. Now I need to get back to my real work.


Pingbacks are closed.


  1. Richard Esplin

    Richard Esplin on #

    I was tripped up on the image uploads.

    ZINNIA_UPLOAD_TO I defined the full server path using my MEDIA_ROOT variable. It would upload successfully to that path, but the link would be displayed as http://hostname/full_server_path, which is invalid. This is because it uses the same variable for both the upload and the download link (the path is stored in the zinnia_entry table of the database).

    The trick is that ZINNIA_UPLOAD_TO should be a relative path within your MEDIA_ROOT. It is then correctly combined with MEDIA_ROOT on upload and MEDIA_URL in the template.

  2. Richard Esplin

    Richard Esplin on #

    Another tip:

    Moderation is turned on with ZINNIA_AUTO_MODERATE_COMMENTS=True. It defaults to False, and the documentation isn't absolutely clear that False means moderation off.

Comments are closed.