2010-06-09 16 views
16

presented in this question ile aynı bilmece var, ancak Django'nun auth.User.request.user bir proxy auth.User sınıfına nasıl dönüştürülür?

Bu vekil modeli vardır:

class OrderedUser(User): 
    def __unicode__(self): 
     return self.get_full_name() 

    class Meta: 
     proxy=True 
     ordering=["first_name", "last_name"] 

Ve diğer modellerin bazıları bir OrderedUser yerine alan türleri gibi django.contrib.auth.models.User bir kullanımı.

'Cannot assign "<User...>": <field> must be a "OrderedUser" instance' 

ben OrderedUser.objects.get(request.user.id) sadece yapabileceği, ama bu veritabanına ekstra isabet: bir hatayla - beklendiği gibi - Benim görünümlerinde

Sonra request.user bir alanı doldurmak ve kullanmak.

Nasıl bir temel model sınıfını proxy sınıfına dönüştürmek?

cevap

14

Başka bir veritabanı isabet, ama bu çalışacaktır: Sen deneyebilirsiniz

OrderedUser.objects.get(pk=request.user.pk) 

Edit:

o = OrderedUser() 
o.__dict__ = request.user.__dict__ 
+0

doğrudan buradan örneği kullanarak katman kod böyle görünebilir. DB'ye isabet etmeyen bir mekanizma var mı? – cethegeek

+2

Evet, hile kopyalayarak hile yaptı. Teşekkürler Daniel. – cethegeek

+3

Bu bahşiş için teşekkürler. Bununla birlikte, bir kullanıcı nesnesini şablonlara iletmek için bir context_processor'da kullanırken, kullanıcı giriş yapmamışsa, bunu farklı bir şekilde yapmanız gerekir. Ancak, elinizde olduğu gibi, her zaman biter. bir OrderedUser nesnesi (Kullanıcıdan türetilmiş), ancak kullanıcı giriş yapmadıysa, AnonymousUser türünde olmalıdır. Bu yüzden, 'request.user.is_authenticated()' ifadesini test ederdim ve eğer öyleyse, yalnızca yukarıdaki işlemleri yapardım. Else, do 'o = request.user'. –

10

ben alamadım kopya dict yöntemi Python 2.7 üzerinde çalışmak için .4 ve Django 1.6. Onu sonuna kadar izlemedim, ama bunun tembel bir nesne olmasıyla ilgili bir şey olduğunu düşünüyorum.

request.user.__class__ = OrderedUser 

Bu veritabanı çağrıyı önler ve temel kimlik denetimi malzeme ve tüm genişletilmiş davranışlara erişim sağlar: benim için çalıştı Ne

.

vekil sınıfı gibi request.user hareket daima, bunu referans olabilir önce kimlik orta katman ve sonra uygulamalarıma herhangi katman atamayı koymak yapmak. Her bir talebe ara katman adı verildiğinden, sınıfı ayarlamadan önce kullanıcının doğrulandığından emin olun.

from yourapp.models import OrderedUser 

class OrderedUserMiddleware(): 
    def process_request(self, request): 
     if hasattr(request, 'user') and request.user.is_authenticated(): 
      request.user.__class__ = OrderedUser 

Ve kimlik doğrulamasının ardından orta katman kayıt unutmayın:

MIDDLEWARE_CLASSES = [ 
    # ...middleware from the guts of Django, none of your middle wares yet... 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    # ...more middleware from the guts of Django, none of your middlewares yet... 
    'yourapp.middleware.OrderedUserMiddleware', 
    # ...more middleware from you other middlewares... 
] 
+0

Sadece aradığım şey. – Charlesliam

+0

Bu harika çalışıyor, ancak django-rest-framework kimlik doğrulaması ile çalışırken ara katman yazılımı alamadım ve __class__ ayarına başvurmak zorunda kaldım. – MrDBA

İlgili konular