2010-06-25 25 views
8

He encontrado aquí en stackoverflow una solución para extender django-registration con nuevos campos usando señales. Aquí está el enlace: http://dmitko.ru/?p=546.
He creado el modelo de perfil extendido, la forma extendida, agregué las opciones requeridas a las configuraciones, las URL definidas y se muestra la forma correcta, pero solo se crea el usuario normal (del módulo auth). ¿Por qué está sucediendo eso?Extendiendo django-registration usando las señales

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) 

que necesitan este InheritedProfile ser abstracto como otros modelos utilizarán los mismos campos.

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

y opciones añadidas a la configuración:

AUTH_PROFILE_MODULE = 'account.UserProfile' 
ACCOUNT_ACTIVATION_DAYS = 7 

finalmente es así como la señal de registro se parece a:

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

EDIT: sangría de user_created cha NGES nada hasta que he intentado cambiar

user_registered.connect(user_created) 

a

user_registered.connect(user_created, sender=UserProfile) 

Ahora que estaba recibiendo:
"SMTPServerDisconnected
Excepción Ubicación: /bin/python-2.6.1/lib/ python2.6/smtplib.py en getreply, línea 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 

Aunque estoy usando un backend de correo electrónico ficticio en este momento. Al comentar el envío de la función de correo en el momento del registro, resolvió este problema, pero aún así mi usuario ampliado no se crea.

Respuesta

11

¿Puede ser el problema en la forma en que se conecta a la señal? En mi solución fue:

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) 

y en la tuya:

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

Además, me gustaría cambiar el registro para asegurar que su método se llama. Mi solución funciona bien en la producción; si lo necesita, puedo buscar otros detalles.

+0

no no, mire con cuidado. Mi función se conecta de la misma manera. Acabo de proporcionar el código de la señal registrada por el usuario. Cambié de herencia a método de relación con mi usuario aquí: http://stackoverflow.com/questions/3124052/models-does-not-create-tables-when-synched y el código de esta función bloquea de alguna manera la creación de mis tablas . ¿Dónde has puesto esta función? ¿Y no debería proporcionar el remitente cuando se conecta con esta señal? – crivateos

+0

He movido esta función a un archivo diferente. Ahora se crean mis tablas, pero todavía no estoy obteniendo perfiles de usuario extendidos. – crivateos

+2

este código está en el archivo 'regbackend.py' que está en el mismo nivel que urls.py y se importa en urls.py justo antes de los patrones de coincidencia. Este código se copia directamente de regbackend.py (se proporciona el remitente) y este archivo no contiene nada más. – dmitko

Cuestiones relacionadas