Skip to content

sorl/django-exmodel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

django-exmodel

The ex-model lets you extend models in apps by adding mixins to them. The mixins can override fields and methods of the original model.

The order is important in ÌNSTALLED_APPS:

...
'email_staff',
'extended_staff',
'staff',
...

This is what staff.models looks like:

from django.db import models
from exmodel import Model, extend_model


class Person(Model):
    name = models.CharField(max_length=10)
    room = models.CharField(max_length=10)

    def __unicode__(self):
        return self.name

    class Meta:
        app_label = 'staff'
        verbose_name = u'Person name'

One of the extending the staff app models extended_staff.models:

class PersonMixin(object):
    name = models.CharField(max_length=500)
    alias = models.CharField(max_length=500)

    def __unicode__(self):
        return u'%s (%s)' % (self.name, self.alias)

    class Meta:
        verbose_name = u'Person name and alias'


extend_model('staff.Person', PersonMixin)

The email_staff.models will have precedence since it´s app is listed first in INSTALLED_APPS:

class PersonEmailMixin(object):
    name = models.CharField(_('name please'), max_length=100)
    email = models.EmailField(max_length=500)

    def get_email_address(self):
        return u'%s <%s>' % (self.name, self.email)

extend_model('staff.Person', PersonEmailMixin)

Now if you do from staff.models import Person the resulting model will be:

class Person(Model):
    name = models.CharField(_('name please'), max_length=100)
    room = models.CharField(max_length=10)
    alias = models.CharField(max_length=500)
    email = models.EmailField(max_length=500)

    def __unicode__(self):
        return u'%s (%s)' % (self.name, self.alias)

    def get_email_address(self):
        return u'%s <%s>' % (self.name, self.email)

    class Meta:
        app_label = 'staff'
        verbose_name = 'Person name and alias'

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages