On Mon, 2009-04-20 at 15:17 -0700, Paul McLanahan wrote:
> I'm using a proxy model of django.contrib.auth.models.User to override
> __unicode__ and add some extra methods. This also means that I use my
> proxy model class in my ForeignKey and ManyToMany fields. This is all
> find and good until I need to use request.user and assign it to an
> instance of another of my models. Django tells me that I can't assign
> an instance of User where I need an instance of my proxy class. Right
> now I'm doing something I'm sure is very inefficient to get around
> this:
> 
> obj.author = ProxyUser.objects.get(pk=request.user.pk)

You could assign the ID directly rather than assigning the object
instance:

  obj.author_id = request.user.id

But if you then try to use the obj.author object in your code, it will
still perform an extra DB lookup.

Another approach is to install a custom authentication backend that
returns instances of ProxyUser instead of User.  This would ensure that
request.user is always an instance of your proxy class.  I'm using a
backend like the following in a similar situation and it works great:

    class ProxyUserBackend(ModelBackend):

        def authenticate(self,username=None,password=None):
            try:
                user = ProxyUser.objects.get(username=username)
            except ProxyUser.DoesNotExist:
                user = None
            if user is not None and user.check_password(password):
                return user
            return None

        def get_user(self,user_id):
            try:
                return ProxyUser.objects.get(pk=user_id)
            except ProxyUser.DoesNotExist:
                return None



  Cheers,

     Ryan


-- 
Ryan Kelly
http://www.rfk.id.au  |  This message is digitally signed. Please visit
r...@rfk.id.au        |  http://www.rfk.id.au/ramblings/gpg/ for details

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to