使用信号扩展django注册 [英] Extending django-registration using signals

查看:132
本文介绍了使用信号扩展django注册的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在stackoverflow中找到了一个使用信号扩展django注册新字段的解决方案。以下是链接: http://dmitko.ru/?p=546

我已经创建了扩展配置文件模型,扩展形式,添加所需的选项到设置,定义的网址,正确的表单显示,但只有普通的用户(从auth模块)被创建。为什么会发生这种情况?

I have found here on stackoverflow a solution to extend django-registration with new fields using signals. Here's the link : http://dmitko.ru/?p=546 .
I have created extended profile model, extended form, added required options to settings , defined urls and the proper form is displayed but only normal User (from auth module) is created. Why is that happening ?

account.models:

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是抽象的,因为其他模型将使用相同的字段。

I need this InheritedProfile to be abstract as other models will use the same fields.

account.forms

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

最后这是注册信号如何:

finally this is how the registration signal looks like :

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

编辑:
在我尝试更改

Indentation of user_created changes nothing until I've tried changing

user_registered.connect(user_created) 

user_registered.connect(user_created, sender=UserProfile)

现在我得到:

SMTPServerDisconnected

异常位置:getbin中的/bin/python-2.6.1/lib/python2.6/smtplib.py,第340行

追溯:

Now I was getting :
"SMTPServerDisconnected
Exception Location: /bin/python-2.6.1/lib/python2.6/smtplib.py in getreply, line 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

即使我现在使用虚拟电子邮件后端。注册发送邮件功能注册后解决了这个问题,但仍然是我的扩展用户未创建。

Even though I'm using dummy email backend at the moment. Commenting out sending mail function upon registration solved this problem but still my extended user is not created.

推荐答案

可能是问题在于你如何连接到信号的方式?在我的解决方案是:

May be the problem is in the way how you connect to the signal? In my solution in was:

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

另外,我将打开日志记录,以确保您的方法被调用。我的解决方案在生产中可以正常工作,如果您需要我可以查找其他详细信息。

Also, I would switch on logging to ensure that your method is called. My solution works fine in the production, if you need I can look for other details.

这篇关于使用信号扩展django注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆