Subclassing AbstractUser in Django for two types of users -
i'm developing school database system in django 1.5, , planning on having number of different user types (student, staff, parent) subclass abstractuser (actually, abstract subclass of abstractuser). attempting add externally developed app system, uses user in foreignkey of models, however, fails user type not 'user' instance. can't set apps models use abstractuser 1 can't use abstract classes foreign keys. considering adding settings.py auth_user_model = 'myapp.myuser' , using settings.auth_user_model in place of user foreignkey in app. however, have 3 different user types, can't either.
an earlier prototype used django 1.4, did not support custom user models, hence had reference user instead, required join every query, leading quite complex queries. way can go forward this, or there solution?
i have used following solution:
1. create schooluser class in models.py - auth_user_model class
types = (('student', 'student'), ('staff', 'staff'), ('parent', 'parent'), ) class schooluser(abstractuser): type = models.charfield(max_length=10, choices=types, default='student') 2. create users.py file , put whole users logic there. have 1 abstract class others inherit , implement factory method:
class usermanager(object): def __init__(self, user): self.user = user @classmethod def factory(cls, user): """ dynamically creates user object """ if cls.__name__.startswith(user.type): # children class naming convention important return cls(user) sub_cls in cls.__subclasses__(): result = sub_cls.factory(user) if result not none: return result sample children classes (also go users.py file):
class studentuser(usermanager): def do_something(self): pass class staffuser(usermanager): def do_something(self): pass class parentuser(usermanager): def do_something(self): pass views magic happens ;)
def my_view(request): school_user = usermanager.factory(request.user) if school_user.do_something: # each class can have different behaviour this way don't need know, type of user is, implement logic.
hope clear enough, if not let me know!
Comments
Post a Comment