Расширение django-регистрации с помощью сигналов

Я нашел здесь на stackoverflow решение расширить django-регистрацию с помощью новых полей с помощью сигналов. Вот ссылка: http://dmitko.ru/?p=546.
Я создал расширенную модель профиля, расширенная форма, добавленные требуемые опции к настройкам, определила URL, и надлежащая форма отображена, но только обычный пользователь (от подлинного модуля) создается. Почему это происходит?

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)

Мне нужен этот InheritedProfile для краткого обзора, поскольку другие модели будут использовать те же поля.

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

и опции, добавленные к настройкам:

AUTH_PROFILE_MODULE = 'account.UserProfile'
ACCOUNT_ACTIVATION_DAYS = 7

наконец это - то, как регистрационный сигнал похож:

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

Править: Добавление отступа user_created ничего не изменяет, пока я не попытался измениться

user_registered.connect(user_created) 

кому:

user_registered.connect(user_created, sender=UserProfile)

Теперь я добирался:
"SMTPServerDisconnected
Расположение исключительной ситуации:/bin/python-2.6.1/lib/python2.6/smtplib.py в getreply, строка 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

Даже при том, что я использую фиктивный почтовый бэкенд в данный момент. Комментирование отправки почтовой функции после регистрации решило эту проблему, но тем не менее мой расширенный пользователь не создается.

8
задан crivateos 25 June 2010 в 16:34
поделиться

1 ответ

Может проблема в способе подключения к сигналу? В моем решении было:

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)

, а в вашем:

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

Кроме того, я бы включил ведение журнала, чтобы гарантировать, что ваш метод вызывается. Мое решение отлично работает на производстве, если вам нужно, я могу поискать другие детали.

11
ответ дан 5 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: