Snippet List
    
        
        
            
                
                This snippet is an extension of [i18n base model for translatable content](http://djangosnippets.org/snippets/855/) so all the same usage applies.
I have extended this module in several ways to make it more fully featured.
* `I18NMixin` can be an additional (via multiple inheritance) or alternative superclass for your models juxtaposed with an `I18NModel`.
  * Adds a property `_` to access the appropriate I18NModel. `trans` aliases this (or rather vice versa) for template access.
* In a call to `.filter` you can query on translated fields by wrapping those fields in a call to i18nQ. I like to import this as _ if I haven't already used that import. 
* A call to I18NFieldset will return an inline for use in the builtin admin app. I like to call this inline to the assignment to inlines.
* If you need abstracted access to the I18N model from a model, I've added a property I18N referring to it. 
I've been using this with great convenience and stability. 
                
                    
                    
                    - models
- i18n
- metaclass
- translated-content
 
            
            
        
        
        
            
                
                Enables convenient adding of fields, methods and properties to Django models.
Instead of:
    User.add_to_class('foo', models.CharField(...)
    User.add_to_class('bar', models.IntegerField(...)
you can write:
    class UserMixin(ModelMixin):
        model = User
        
        foo = models.CharField(...)
        bar = models.IntegerField(...)
                
                    
                    
                    - mixin
- metaclass
- util
- metaprogramming
 
            
            
        
        
        
            
                
                Together with my mentor, Dusty Phillips, I have developed a simple class that dynamically adds two fields to its subclasses.
This is useful in cases when a single piece of content is divided into translatable and non-translatable fields, connected by a 1-to-many relationship.
## Update 2009/03/30
Since its inception, this snippet has grown into a significantly more powerful solution for translatable content (I use it myself with great joy :). The project is now hosted on github:
[project page](http://github.com/foxbunny/django-i18n-model/tree/master)
## Update 2008/07/09
It is now possible to define `i18n_common_model` attribute in `class Meta` section. Here's an example:
    class Meta:
        i18n_common_model = "MyCommonModel"
As you can see, it has to be a string, not the real class, and it is case-sensitive.
## Example
    class Article(models.Model):
        author = models.CharField(max_length = 40)
        
        class Admin:
            pass
    class ArticleI18N(I18NModel):
        title = models.CharField(max_length = 120)
        body = models.TextField()
        class Admin:
            pass
        # optionally, you can specify the base class
        # if it doesn't follow the naming convention:
        #
        # class Meta:
        #     i18m_common_model = "Article"
When the ArticleI18N class is created, it automatically gains two new fields. `lang` field is a CharField with choices limited to either `settings.LANGUAGES` or `django.conf.global_settings.LANGUAGES`. The other field is `i18n_common` field which is a ForeignKey to Article model.
## The conventions
* call the translation model `SomeBaseModelI18N`, and the non-translation model SomeBaseModel (i.e., the translation model is called basename+"I18N")
* the first convention can be overriden by specifying the base model name using the `i18n_common_model` attribute in `Meta` section of the `I18N` model
* I18N model is a subclass of `I18NModel` class
## Original blog post
[http://blog.papa-studio.com/2008/07/04/metaclasses-and-translations/](http://blog.papa-studio.com/2008/07/04/metaclasses-and-translations/)
                
                    
                    
                    - models
- i18n
- metaclass
- translated-content
 
            
            
        
        
        
            
                
                If you try to use multiple inheritance with a modelform (to mix in some fields from an already existing form class for example) you'll get the following rather terrifying error:
> "Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases"
The solution is to first create the ModelForm, then create a NEW class that inherits from both the ModelForm and the form you want to mixin, then finally apply the recipe from here: [http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/204197](http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/204197)
                
                    
                    
                    - newforms
- inheritance
- modelforms
- multipleinheritance
- metaclasses
- metaclass
 
            
            
        
        
     
    
    4 snippets posted so far.