2010-09-14 30 views
18

Kodumdaki bir çok yerde request.user.get_profile() kullanıyorum. Ancak, tüm kullanıcıların hesaplarıyla ilgili bir kullanıcı profili yoktur. request.user.get_profile() çağrıları sırasında, request.user.get_profile() çağrılarımın her birini değiştirmek zorunda kalmadan bir kullanıcı yoksa otomatik olarak bir kullanıcı profili oluşturabilmemin bir yolu var mı? Belki sinyaller ya da bir şey kullanırız.Django yoksa kullanıcı profili oluştur

Sahip olduğum sorun şu ki, oturum açma girişini kullanıyorum, böylece birisi başka bir sistemde oturum açtığında siteme gider ve kullanıcı profili oluşturulmaz. oturum açtıklarında profil).

+0

bu SO http://stackoverflow.com/questions/17806683/create-row sorgulamaya kontrol ediniz, olduğu yerde kendi Bununla istediğiniz zaman ./manage.py missing_profiles çalıştırabilir veya cron işi eklemek -oru-zaman-oluşturma-superuser hangi sorunla karşı karşıya, gelmek mümkün değil – user2086641

cevap

22

Genellikle kullanıcı profili nesneleri, kullanıcı örneği oluşturulduktan hemen sonra oluşturulur. Bu, sinyaller kullanılarak kolayca gerçekleştirilebilir.

The problem I have is that I use a single sign-in login so if someone logs in on another system and then goes to my site they are logged in but don't get a user profile created (I create a user profile when they log in).

Görünüşte kullanıcı oluşturma zamanında sinyalleri kullanarak sizin için çalışmayacaktır. Yapmaya çalıştığınız şeyi başarmanın bir yolu, çağrıları özel bir işlevle request.user.get_profile() yerine koymak olacaktır. get_or_create_user_profile(request) deyin. Bu işlev, bir kullanıcının profilini almaya çalışabilir ve mevcut değilse, anında bir tane oluşturabilir. Ben bu sitede kullanmak ister bu çözüm bulduk

def get_or_create_user_profile(request): 
    profile = None 
    user = request.user 
    try: 
     profile = user.get_profile() 
    except UserProfile.DoesNotExist: 
     profile = UserProfile.objects.create(user, ...) 
    return profile 
+1

Teşekkürler. Bu cevabı beğendim, ancak kodumdaki request.user.get_profile() öğesinin tüm örneklerini değiştirmeye istekli değildim. UserProfile post_get'e ekleyebildiğim bir işaret yok (eğer var mı bilmiyorum) – John

+0

@John: AFAIK 'get' ('post'' dediğiniz gibi) üzerinde gönderilen bir sinyal yoktur. Dokümanlar, http://docs.djangoproject.com/en/dev/ref/signals/ –

+0

'u katmanda ne yapıyor? – John

3

:

eg için

böyle bir özellik yeni bir yöntem tanımlayan daha temiz görünüyor kullanma http://www.turnkeylinux.org/blog/django-profile

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) 

ama ben kabul Kod tabanından geçmek ve referanslarını user.profile olanlara değiştirmek bir acı olur.

Öyleyse, genel dosya arama ve değiştirme işleviniz bunun için değil mi? Gerekirse

def get_or_create_profile(user): 
    """ 
    Return the UserProfile for the given user, creating one if it does not exist. 

    This will also set user.profile to cache the result. 
    """ 
    user.profile, c = UserProfile.objects.get_or_create(user=user) 
    return user.profile 

User.profile = property(get_or_create_profile) 

Yani bu bir profil oluşturur ve User.profile.field = "deep" sonra User.profile.save() çalışır:

+0

Genellikle, ilk kullanıcı (süper kullanıcı), ./manage.py startapp' sırasında oluşturulduğundan, profilinin oluşturulmasına neden olmaz. – hobbes3

+2

Bu çözümle ilgili sorun, User.profile öğesine her başvurduğunuzda profili almak için db'ye basmasıdır. Örneğin. Eğer böyle bir şey yaparsanız: User.profile.field = "derp" sonra User.profile.save(), db dosyasından yeniden yüklenir ve kaydetmeden önce değişikliklerinizi kaybedersiniz. Noktası, özelliklerin kötü kullanımı. Bu işlevsellik yerine bir yöntem kullanın imo – sqwerty

+0

Hmm Bunun kötü bir özellik olduğunu düşünmüyorum. Ancak bir iyileşme gönderirim. –

3

bskinner cevabı üzerine ve sqwerty yorumuna cevaben Bina, bunu kullanabilir.

1

Aşağıdaki gibi revize edilmiştir. Aksi takdirde, "AttributeError: özniteliği ayarlayamaz" ifadesi gösterilir. Veli ataması izni isteğe bağlıdır.

 
def get_or_create_profile(user): 
    profile, created = UserProfile.objects.get_or_create(user=user) 
    assign('change_userprofile', user, profile) 
    assign('delete_userprofile', user, profile) 
    return profile 

User.profile = property(get_or_create_profile) 
1

Burada eksik olan kullanıcılar için varsayılan profiller oluşturmak için kullanılabilecek bir quickie yönetim komutu. vb

from django.core.management.base import BaseCommand 
from django.contrib.auth.models import User 
from people.models import Profile 

''' 
Create default profiles for any User objects that lack them. 
''' 


class Command(BaseCommand): 
    help = "Create default profiles for any User objects that lack them." 

    def handle(self, *args, **options): 
     users = User.objects.filter(profile=None) 
     for u in users: 
      Profile.objects.create(user=u) 
      print("Created profile for {u}".format(u=u)) 
İlgili konular