2010-06-25 2 views
8

나는 신호를 사용하여 장고 등록을 새로운 필드로 확장하는 솔루션 인 stackoverflow를 발견했다. 링크는 http://dmitko.ru/?p=546입니다.
확장 프로필 모델, 확장 된 양식, 설정에 필요한 옵션, 정의 된 URL을 추가했으며 적절한 양식이 표시되지만 인증 모듈의 일반 사용자 만 생성됩니다. 왜 그런 일이 일어나는거야?신호를 사용하여 장고 등록 확장하기

account.models는 : 다른 모델은 동일한 필드를 사용하므로

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) 

나는 추상적 인 수 있도록이 InheritedProfile이 필요합니다.

AUTH_PROFILE_MODULE = 'account.UserProfile' 
ACCOUNT_ACTIVATION_DAYS = 7 

마지막으로이 등록 신호가 같은 모습입니다 :

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

편집 : 들여 쓰기를

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") 

및 옵션 설정에 추가 user_created cha의
"
예외 위치 SMTPServerDisconnected : 나는

user_registered.connect(user_created) 

내가 얻고 있었다 지금

user_registered.connect(user_created, sender=UserProfile) 

에 변화 시도했습니다 때까지 아무것도 nges하지 /bin/python-2.6.1/lib/을 pyrex2.6/smtplib.py in getreply, line 340 "
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 

비록 지금은 더미 이메일 백엔드를 사용하고 있습니다. 등록시 메일 보내기 기능을 주석 처리하면이 문제가 해결되지만 확장 사용자는 생성되지 않습니다.

답변

11

신호가 연결되는 방식에 문제가있을 수 있습니까? 내 솔루션에 있었다 :

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) 

과 당신의

:

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

또한, 나는 당신의 메서드를 호출 할 수 있도록 로깅을 전환 할 것입니다. 내 솔루션은 제작 과정에서 잘 작동합니다. 필요한 경우 다른 세부 정보를 찾을 수 있습니다.

+0

아니요, 잘보세요. 내 기능도 같은 방식으로 연결됩니다. 나는 user_registered 신호의 코드를 제공했다. 나는 상속에서 관계 메서드에 내 사용자 여기에 전환했습니다 : http://stackoverflow.com/questions/3124052/models-does-not-create-tables-when-synched이 코드는 어떻게 든 내 테이블 생성을 차단합니다 . 이 기능을 어디에 넣었습니까? 그리고이 신호를 연결할 때 발신자를 제공하면 안됩니까? – crivateos

+0

이 함수를 다른 파일로 이동했습니다. 이제 내 테이블이 생성되었지만 여전히 확장 된 userprofile이 생성되지 않습니다. – crivateos

+2

이 코드는 urls.py와 동일한 수준의 'regbackend.py'파일에 있으며 일치 패턴 바로 전에 urls.py로 가져옵니다. 이 코드는 regbackend에서 직접 복사됩니다.py (보낸 사람이 제공되므로)이 파일에는 다른 내용이 들어 있지 않습니다. – dmitko

관련 문제