2010-06-25 25 views
8

Tôi đã tìm thấy ở đây trên stackoverflow một giải pháp để mở rộng đăng ký django với các trường mới sử dụng tín hiệu. Đây là liên kết: http://dmitko.ru/?p=546.
Tôi đã tạo mô hình hồ sơ mở rộng, biểu mẫu mở rộng, thêm tùy chọn bắt buộc cho cài đặt, url được xác định và biểu mẫu thích hợp được hiển thị nhưng chỉ người dùng bình thường (từ mô-đun auth) được tạo. Tại sao điều đó lại xảy ra?Mở rộng đăng ký django bằng cách sử dụng tín hiệu

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) 

Tôi cần InheritedProfile này là trừu tượng như các mô hình khác sẽ sử dụng các lĩnh vực tương tự.

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

và các tùy chọn bổ sung vào cài đặt:

AUTH_PROFILE_MODULE = 'account.UserProfile' 
ACCOUNT_ACTIVATION_DAYS = 7 

cuối cùng đây là cách các tín hiệu đăng ký trông giống như:

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

EDIT: Indentation của user_created cha nges gì cho đến khi tôi đã cố gắng thay đổi

user_registered.connect(user_created) 

để

user_registered.connect(user_created, sender=UserProfile) 

Bây giờ tôi đã nhận được:
"SMTPServerDisconnected
Exception Location: /bin/python-2.6.1/lib/ python2.6/smtplib.py trong getreply, dòng 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ặc dù tôi đang sử dụng chương trình phụ trợ email giả tại thời điểm này. Nhận xét về chức năng gửi thư khi đăng ký đã giải quyết được sự cố này nhưng người dùng mở rộng của tôi vẫn chưa được tạo.

Trả lời

11

Có thể vấn đề là cách bạn kết nối với tín hiệu? Trong giải pháp của tôi trong là:

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) 

và trong của bạn:

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

Ngoài ra, tôi sẽ chuyển về khai thác gỗ để đảm bảo rằng phương pháp của bạn được gọi. Giải pháp của tôi hoạt động tốt trong sản xuất, nếu bạn cần tôi có thể tìm kiếm các chi tiết khác.

+0

không không, hãy xem kỹ. Chức năng của tôi kết nối theo cùng một cách. Tôi vừa cung cấp mã tho của tín hiệu user_registered. Tôi đã chuyển từ thừa kế sang phương thức quan hệ với người dùng của tôi ở đây: http://stackoverflow.com/questions/3124052/models-does-not-create-tables-when-synched và mã của hàm này bằng cách nào đó chặn tạo bảng của tôi . Bạn đã đặt chức năng này ở đâu? Và nó không nên cung cấp cho người gửi khi kết nối với tín hiệu này? – crivateos

+0

Tôi đã chuyển chức năng này sang một tệp khác. Bây giờ bảng của tôi được tạo nhưng tôi vẫn không tạo được hồ sơ người dùng mở rộng. – crivateos

+2

mã này nằm trong tệp 'regbackend.py' có cùng cấp với urls.py và được nhập trong urls.py ngay trước mẫu khớp. Mã này được sao chép trực tiếp từ regbackend.py (do đó người gửi được cung cấp) và tệp này không chứa bất kỳ thứ gì khác. – dmitko

Các vấn đề liên quan