SORU
15 Aralık 2009, Salı


Genişletilmiş kullanıcı profili oluşturma

Django genişletilmiş İlgili bir model var:

class UserProfile(models.Model):
  user = models.ForeignKey(User, unique=True)
  #other things in that profile

Ve bir signals.py:

from registration.signals import user_registered
from models import UserProfile
from django.contrib.auth.models import User

def createUserProfile(sender, instance, **kwargs):
  profile = users.models.UserProfile()
  profile.setUser(sender)
  profile.save()

user_registered.connect(createUserProfile, sender=User)

Sinyal __init__.py benim bu sahip olarak kayıtlı olduğundan emin olun

import signals

Bana kaydeden her bir kullanıcı için yeni bir kullanıcı Profili oluşturmanız gerekir, değil mi? Ama olmuyor. Ben her zaman "İlgili eşleşen sorgu" hataları oturum açmaya çalıştığınızda, veritabanı girişi yok demektir. yok olsun

User_registered sinyali veren django-kayıt, kullandığım diyebilirim.

Yapının önemli uygulamalar için bu, Sahip olduğum bir uygulama adı "kullanıcı", var: models.py, signals.py, urls.py ve views.py (ve bazı başka şeyler hangi gerekmiyor mu önemli burada). İlgili sınıf models.py tanımlanır.

Güncelleme: Signals.py değiştirdim:

from django.db.models.signals import post_save
from models import UserProfile
from django.contrib.auth.models import User

def create_profile(sender, **kw):
    user = kw["instance"]
    if kw["created"]:
        profile = UserProfile()
        profile.user = user
        profile.save()

post_save.connect(create_profile, sender=User)

Ama şimdi anlıyorum "": . İntegrityError

< . p ^"sütun user_id benzersiz değildir"

Edit 2:

Buldum. Bir şekilde sinyali iki defa her şey göründüğü gibi. Bu burada açıklanan geçici çözüm için: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave

Dispatch_uid, şimdi benim signals.py bu gibi bir ekleme yaptım ve çalışıyor:

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from models import UserProfile
from django.db import models

def create_profile(sender, **kw):
    user = kw["instance"]
    if kw["created"]:
        profile = UserProfile(user=user)
        profile.save()

post_save.connect(create_profile, sender=User, dispatch_uid="users-profilecreation-signal")

CEVAP
15 Aralık 2009, Salı


Bu kullanıcı post_save kullanarak uygulayabilirsiniz:

from django.db.models.signals import post_save
from models import UserProfile
from django.contrib.auth.models import User

def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        profile = users.models.UserProfile()
        profile.setUser(sender)
        profile.save()

post_save.connect(create_profile, sender=User)

Düzenleme:
Test edilmiş ve çalışan başka bir olası çözüm, (sitemde kullanıyorum):

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        up = UserProfile(user=user, stuff=1, thing=2)
        up.save()
post_save.connect(create_profile, sender=User)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CommonArtisan

    CommonArtisa

    7 Temmuz 2012
  • Jonnyriddlin1

    Jonnyriddlin

    4 Ocak 2007
  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009