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.
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
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
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