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.
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
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
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