2011-07-12 22 views
12

Farklı kullanıcı türlerine izin veren bir Django uygulamasına sahibim: firmalar, yöneticiler, dış kişiler vb. Elbette bunların hepsi varsayılan kimlik doğrulama sistemi ve grupları ile yönetilebilir.Django - Farklı kullanıcı profili profilleri

Sorunum, farklı gruplara ait kullanıcıların farklı ilişkili bilgilere sahip olmalarıdır. Örneğin, şirketlerin özel kullanıcılar için anlamlı olmayan bazı ticari bilgiler sağlaması gerekir. Bu yüzden gruba bağlı olarak farklı türden profiller eklemem gerekiyor. (Uygulama gruplarında karşılıklı olarak özeldir.)

Ne yazık ki, Django yalnızca tek bir modelin bir profil olarak eklenmesine izin verir ve bu model settings.AUTH_PROFILE_MODULE numaralı belgede bildirilir. Dahili olarak, bu değer temelde sadece bu değeri okuyan ve örneğin, aslında modelin var olduğu bazı kontroller gerçekleştiren User.get_profile() yöntemi tarafından alınır.

User alt sınıflarını ve get_profile() yöntemini geçersiz kılmayı düşünüyordum, böylece gruba bağlı olarak farklı bir model döndürüyor.

Is there a simpler/cleaner way to manage different kind of profiles?

Önerim kullanıcı profilleri Kullanıcı alt sınıfı zorunda kalmamak için tam olarak ortaya çıkmadığını için bu biraz kesmek gibi görünüyor.

cevap

16

User ve related_name için OneToOneField ile bir model oluşturun.

E. g .:

class Firm(models.Model): 
    user = models.OneToOneField(User, related_name='firm') 
    # other fields 

class External(models.Model): 
    user = models.OneToOneField(User, related_name='external') 
    # other fields 

Sonra bu user (if hasattr(request.user, 'firm')) öznitelikleri varlığını kontrol edip düzgün bir örneğini iade edebilirsiniz. Örneğin, request.user_profile'u ayarlayan özel katman yazılımına koyardım.

+0

Bu en basit yol olarak ortaya çıkıyor. Sorunum şu ki, bu profillerin aslında yönetici tarafından doldurulduğunu garanti etmektir. http://stackoverflow.com/questions/6681464/django-admin-validating-inlines-together-with-main-models – Andrea

+0

Bu Kullanıcı modeli, Django ile birlikte gelen varsayılan bir şey değil mi? Çünkü ben 'NameError: name' User 'tanımlı değil' denediğimde bu –

+1

@JulioMarins Evet, bunu almalısınız: 'django.contrib.auth.models içe aktarma ' – DrTyrsa

İlgili konular