2010-06-25 28 views
8

Burada, django-kaydı sinyalleri kullanarak yeni alanlarla genişletmek için bir çözüm buldum. İşte bağlantı: http://dmitko.ru/?p=546.
Genişletilmiş profil modeli oluşturdum, genişletilmiş form, gerekli seçenekleri ekledim, tanımlanmış URL'ler ve uygun form görüntülenir ancak sadece normal Kullanıcı (auth modülünden) oluşturulur. Bu neden oluyor?Sinyalleri kullanarak django kaydını genişletme

account.models: Diğer modeller aynı alanlarını kullanacaktır olarak

from django.db import models 
from django.contrib.auth.models import User 
from registration.signals import user_registered 
import hashlib 

class InheritedProfile(models.Model): 
    first_name = models.CharField("Name", max_length=50, blank=True, null=True) 
    last_name = models.CharField("Last name", max_length=50, blank=True, null=True) 
    pid = models.CharField("PESEL", max_length=11, blank=True, null=True) 
    street = models.CharField("Street", max_length=50, blank=True, null=True) 
    number = models.CharField("Flat/house number", max_length=10, blank=True, null=True) 
    code = models.CharField("Zip ", max_length=6, blank=True, null=True) 
    city = models.CharField("City", max_length=50, blank=True, null=True) 
    class Meta: 
     abstract=True 

class UserProfile(InheritedProfile, User): 
    def upload_path(self, field_attname): 
     filename = hashlib.md5(field_attname).hexdigest()[:4] + "_" + field_attname 
     return "uploads/users/%s" % (filename,) 

    image = models.ImageField(upload_to=upload_path, verbose_name="Image", blank=True, null=True) 

    def user_created(sender, user, request, **kwargs): 
     form = ExtendedRegistrationForm(request.POST) 
     extended_user = UserProfile(user=user) 
     extended_user.is_active = False 
     extended_user.first_name = form.extended_user['first_name'] 
     extended_user.last_name = form.extended_user['last_name'] 
     extended_user.pid = form.extended_user['pid'] 
     extended_user.image = form.extended_user['image'] 
     extended_user.street = form.extended_user['street'] 
     extended_user.number = form.extended_user['number'] 
     extended_user.code = form.extended_user['code'] 
     extended_user.city = form.extended_user['city'] 
     extended_user.save() 

    user_registered.connect(user_created) 

soyut olmasını InheritedProfile gerekir.

AUTH_PROFILE_MODULE = 'account.UserProfile' 
ACCOUNT_ACTIVATION_DAYS = 7 

nihayet bu kayıt sinyali gibi görünüyor::

from django.dispatch import Signal 
# A new user has registered. 
user_registered = Signal(providing_args=["user", "request"]) 

DÜZENLEME: girinti

account.forms

from django import forms 
#import strings 
from registration.forms import RegistrationForm 
from models import UserProfile, InheritedProfile 

class ExtendedRegistrationForm(RegistrationForm): 
    first_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="First name") 
    last_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Last name") 
    pid = forms.RegexField(regex=r'^\d{11}', max_length=11 ,widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50))) 
    image = forms.ImageField(label="Image",) 
    street = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Street") 
    number = forms.CharField(widget=forms.TextInput, label="House/flat number") 
    code = forms.RegexField(regex=r'^\d{2}[-]\d{3}', max_length=6, widget=forms.TextInput(attrs=attrs_dict), label="Postal code") 
    city = forms.CharField(widget=forms.TextInput, label="City") 

ve seçenekleri ayarlarına eklenir kullanıcı tarafından oluşturulan cha
"
İstisna Konum SMTPServerDisconnected: Ben

user_registered.connect(user_created) 

Ben başlamıştı Şimdi

user_registered.connect(user_created, sender=UserProfile) 

değişen denedim kadar hiçbir şey değişmelerin /bin/python-2.6.1/lib/ python2.6/smtplib.py in getreply, satır 340 "satır sayısı"
Traceback:

File "/home/fandrive/site-packages/django/core/handlers/base.py" in get_response 
    92.     response = callback(request, *callback_args, **callback_kwargs) 
File "/home/fandrive/registration/views.py" in register 
    47.    new_user = backend.register(request, **form.cleaned_data) 
File "/home/fandrive/registration/backends/default/__init__.py" in register 
    20.                  password, site) 
File "/home/fandrive/site-packages/django/db/transaction.py" in _commit_on_success 
    240.     res = func(*args, **kw) 
File "/home/fandrive/registration/models.py" in create_inactive_user 
    80.    registration_profile.send_activation_email(site) 
File "/home/fandrive/registration/models.py" in send_activation_email 
    256.   self.user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL) 
File "/home/fandrive/site-packages/django/contrib/auth/models.py" in email_user 
    271.   send_mail(subject, message, from_email, [self.email]) 
File "/home/fandrive/site-packages/django/core/mail.py" in send_mail 
    390.       connection=connection).send() 
File "/home/fandrive/site-packages/django/core/mail.py" in send 
    266.   return self.get_connection(fail_silently).send_messages([self]) 
File "/home/fandrive/site-packages/django/core/mail.py" in send_messages 
    172.    sent = self._send(message) 
File "/home/fandrive/site-packages/django/core/mail.py" in _send 
    186.      email_message.message().as_string()) 
File "/bin/python-2.6.1/lib/python2.6/smtplib.py" in sendmail 
    708.    self.rset() 
File "/bin/python-2.6.1/lib/python2.6/smtplib.py" in rset 
    438.   return self.docmd("rset") 
File "/bin/python-2.6.1/lib/python2.6/smtplib.py" in docmd 
    363.   return self.getreply() 
File "/bin/python-2.6.1/lib/python2.6/smtplib.py" in getreply 
    340.     raise SMTPServerDisconnected("Connection unexpectedly closed") 

Exception Type: SMTPServerDisconnected at /user/register/ 
Exception Value: Connection unexpectedly closed 

Şu anda kukla e-posta arka uç kullanıyorum bile. Kayıt sırasında postalama işlevinin gönderilmesiyle ilgili yorum yapmak bu sorunu çözdü ancak hala genişletilmiş kullanıcım oluşturulmadı.

cevap

11

Sorun, sinyale nasıl bağlandığınız yolunda olabilir mi? Benim çözümde oldu:

def user_created(sender, user, request, **kwargs): 
    form = UserRegistrationForm(request.POST) 
    data = profile.Profile(user=user) 
    data.city_id = form.data["city"] 
    data.save() 

from registration.signals import user_registered 
user_registered.connect(user_created) 

ve senin içinde

:

from django.dispatch import Signal 
# A new user has registered. 
user_registered = Signal(providing_args=["user", "request"]) 

Ayrıca, ben senin yöntem çağrılmasını sağlamak için günlüğü geçiş olacaktır. Benim çözümümde üretimde iyi çalışıyor, eğer ihtiyacınız varsa başka detaylar arayabilirim.

+0

hayır, dikkatli bir şekilde bakın. Benim işlevim aynı şekilde bağlanır. Sadece user_registered sinyalinin kodunu verdim. Burada kullanıcı ile ilişkisinden miras ilişkisine geçtim: http://stackoverflow.com/questions/3124052/models-does-not-create-tables-when-synched ve bu işlevin kodu bir şekilde benim tablolarımın oluşturulmasını engelliyor . Bu işlevi nereye koydunuz? Ve bu sinyale bağlanırken gönderen sağlamaz mı? – crivateos

+0

Bu işlevi farklı bir dosyaya taşıdım. Şimdi tablolarım oluşturuldu ancak hala genişletilmiş kullanıcı profili oluşturulmuyor. – crivateos

+2

Bu kod, urls.py ile aynı düzeydeki 'regbackend.py' dosyasındadır ve eşleşme desenlerinden hemen önce urls.py dosyasında içe aktarılır. Bu kod doğrudan regbackend'ten kopyalanır.py (gönderen sağlanır) ve bu dosya başka bir şey içermiyor. – dmitko

İlgili konular