### 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)
Comments