views:

79

answers:

1

I've got an existing Django site, with a largish variety of templates in use. We've agreed to offer a custom-skinned version of our site for use by one of our partners, who want the visual design to harmonize with their own website. This will be on a separate URL (which we can determine), using a subset of the functionality and data from our main site.

So my question is: what's the best way to add reskin functionality to my site, without duplicating a lot of code or templates?

As I see it, there are several components which need to work together:

  • URL: need to have a different set of URLs which points to the partner-branded version of the site, but which can contain all the standard path info the site needs to build pages.

  • Template 'extends': need to have the templates extend a different base, like {% extends 'partner.html' %} instead of {% extends 'base.html' %}

  • View logic: need to let the views know when this is the partner-branded version, so they can change the business logic appropriately

My idea so far is to put the partner site on a subdomain, then use a middleware to parse the domain name and add 'partner' and 'partner_template' variables to the request object. Thus, I can access request.partner inside my views, to handle business logic. Then, I have to edit all my templates to look like this:

{% extends request.partner_template|default:'base.html' %}

(According to this answer, 'extends' takes a variable just like any other template tag.)

Will this work properly? Is there a better way?

A: 

If you are using different settings.py for the different sites you can specifiy different template loading directories. (Which may default to your unskinned pages.)

Personally I'm not convinced by having different business logic in the same view code, that smells like a hack to me - the same as extensive conditional compilation does in C.

So to sum up.

  1. Use django.contrib.sites and different settings.py
  2. Get a clear idea, how much this is a new app/website using the same data, or just different css/templates.
phoku