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