2010-06-25 9 views
8

Ich habe hier auf stackoverflow eine Lösung gefunden, um die Djangoregistrierung mit neuen Feldern über Signale zu erweitern. Hier ist der Link: http://dmitko.ru/?p=546.
Ich habe erweitertes Profilmodell, erweitertes Formular, fügte erforderliche Optionen zu den Einstellungen hinzu, definierte URLs und die richtige Form wird angezeigt, aber nur normaler Benutzer (vom Authmodul) wird erstellt. Warum passiert das?Erweiterung der Djangoregistrierung mit Signalen

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) 

Ich brauche diese InheritedProfile abstrakt zu sein als andere Modelle die gleichen Felder verwenden.

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

und Optionen hinzugefügt, um Einstellungen:

AUTH_PROFILE_MODULE = 'account.UserProfile' 
ACCOUNT_ACTIVATION_DAYS = 7 

schließlich das ist, wie das Registrierungssignal wie folgt aussieht:

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

EDIT: Einrückungen von user_created cha NGES nichts, bis ich

user_registered.connect(user_created) 

zu

user_registered.connect(user_created, sender=UserProfile) 

Jetzt habe versucht, zu ändern Ich war immer:
"SMTPServerDisconnected
Ausnahme Ort: /bin/python-2.6.1/lib/ python2.6/smtplib.py in getreply, Zeile 340 "
Rückverfolgung:

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 

Obwohl ich im Moment Dummy E-Mail-Backend verwende. Das Auskommentieren der E-Mail-Funktion bei der Registrierung löste dieses Problem, aber mein erweiterter Benutzer wurde noch nicht erstellt.

Antwort

11

Kann das Problem in der Art sein, wie Sie mit dem Signal verbinden? In meiner Lösung in war:

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) 

und in Ihnen:

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

Auch ich wechseln würde die Protokollierung, um sicherzustellen, dass Ihre Methode aufgerufen wird. Meine Lösung funktioniert gut in der Produktion, wenn Sie brauchen, kann ich nach anderen Details suchen.

+0

nein nein, schau genau hin. Meine Funktion verbindet auf die gleiche Weise. Ich habe gerade den Code von user_registered Signal zur Verfügung gestellt. Ich habe hier von der Vererbung zu Relation-Methode mit meinem Benutzer gewechselt: http://stackoverflow.com/questions/3124052/models-does-not-create-tables-when-synched und Code dieser Funktion blockiert irgendwie die Erstellung meiner Tabellen . Wo hast du diese Funktion? Und sollte es nicht Sender zur Verfügung stellen, wenn er sich mit diesem Signal verbindet? – crivateos

+0

Ich habe diese Funktion in eine andere Datei verschoben. Jetzt werden meine Tabellen erstellt, aber ich bekomme immer noch kein erweitertes Benutzerprofil erstellt. – crivateos

+2

Dieser Code befindet sich in der Datei 'regbackend.py', die sich auf der gleichen Ebene wie urls.py befindet und in urls.py kurz vor den Match-Mustern importiert wird. Dieser Code wird direkt von regbackend kopiert.py (so Absender wird zur Verfügung gestellt) und diese Datei enthält nichts anderes. – dmitko