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.
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
Ich habe diese Funktion in eine andere Datei verschoben. Jetzt werden meine Tabellen erstellt, aber ich bekomme immer noch kein erweitertes Benutzerprofil erstellt. – crivateos
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