2010-06-25 21 views
8

J'ai trouvé ici sur stackoverflow une solution pour étendre l'enregistrement de django avec de nouveaux champs utilisant des signaux. Voici le lien: http://dmitko.ru/?p=546.
J'ai créé le modèle de profil étendu, la forme étendue, ajouté les options requises aux paramètres, les URL définies et le formulaire approprié est affiché mais seul l'utilisateur normal (à partir du module d'authentification) est créé. Pourquoi cela se passe-t-il?Extension de l'enregistrement de django en utilisant des signaux

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) 

je besoin de cette InheritedProfile être abstraite que d'autres modèles utiliseront les mêmes champs.

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

et options ont été ajoutées aux paramètres:

AUTH_PROFILE_MODULE = 'account.UserProfile' 
ACCOUNT_ACTIVATION_DAYS = 7 

enfin c'est ainsi le signal d'enregistrement ressemble à:

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

EDIT: Indentation de user_created cha NGES rien jusqu'à ce que je l'ai essayé de changer

user_registered.connect(user_created) 

à

user_registered.connect(user_created, sender=UserProfile) 

Maintenant, je recevais:
"SMTPServerDisconnected
Exception Localisation: /bin/python-2.6.1/lib/ python2.6/smtplib.py dans getreply, ligne 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 

Même si j'utilise un backend de messagerie factice pour le moment. Commenter l'envoi de la fonction de courrier lors de l'inscription a résolu ce problème, mais mon utilisateur étendu n'est toujours pas créé.

Répondre

11

Peut-être le problème est dans la façon dont vous vous connectez au signal? Dans ma solution était:

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) 

et dans le vôtre:

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

Aussi, je changerais sur l'exploitation forestière pour assurer que votre méthode est appelée. Ma solution fonctionne bien dans la production, si vous avez besoin, je peux rechercher d'autres détails.

+0

non non, regardez attentivement. Ma fonction se connecte de la même manière. Je viens de fournir le code du signal enregistré par l'utilisateur. Je suis passé de l'héritage à la méthode de relation avec mon utilisateur ici: http://stackoverflow.com/questions/3124052/models-does-not-create-tables-when-synched et le code de cette fonction bloque en quelque sorte la création de mes tables . Où as-tu mis cette fonction? Et ne devrait-il pas fournir l'expéditeur lors de la connexion avec ce signal? – crivateos

+0

J'ai déplacé cette fonction dans un fichier différent. Maintenant, mes tables sont créées mais je n'ai toujours pas de profil d'utilisateur étendu créé. – crivateos

+2

ce code est dans le fichier 'regbackend.py' qui est au même niveau que urls.py et est importé dans urls.py juste avant les modèles de correspondance. Ce code est copié directement à partir de regbackend.py (donc l'expéditeur est fourni) et ce fichier ne contient rien d'autre. – dmitko