### models.py ### from django.contrib.contenttypes.generic import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType from django.conf import settings from django.db import models class Url(models.Model): content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField(db_index=True) content_object = GenericForeignKey() url_string = models.CharField(max_length=256, db_index=True) language = models.CharField(max_length=2, choices=settings.LANGUAGES, db_index=True) class Meta: unique_together = (('content_type', 'object_id'), ('url_string', 'language')) class UrlModel(models.Model): urls = GenericRelation(Url) class Meta: abstract = True def view(self, request): raise NotImplementedError ### middleware.py ### from django.utils.translation import get_language from models import Url class UrlMiddleware(object): def process_response(self, request, response): if not response.status_code == 404: return response try: url = Url.objects.get(url_string=request.path_info, language=get_language()) except Url.DoesNotExist: return response return url.content_object.view(request) ### admin.py ### from django.contrib.contenttypes.generic import GenericTabularInline from django.conf import settings from models import Url class UrlInline(GenericTabularInline): model = Url max_num = len(settings.LANGUAGES)