تمديد التسجيل django باستخدام إشارات
-
29-09-2019 - |
سؤال
لقد وجدت هنا على Stackoverflow حل لتوسيع نطاق Django مع حقول جديدة باستخدام إشارات. إليك الرابط : http://dmitko.ru/؟p=546 .
لقد قمت بإنشاء نموذج ملف تعريف موسع ، ونموذج موسع ، وخيارات مطلوبة للإضافة إلى الإعدادات ، وعناوين URL المحددة ويتم عرض النموذج المناسب ولكن يتم إنشاء المستخدم العادي فقط (من وحدة AUTH). لماذا يحدث ذلك؟
حساب. النماذج:
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)
أحتاج إلى أن يكون هذا الموروثة مجردة لأن النماذج الأخرى ستستخدم نفس الحقول.
حساب
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 "
تتبع الأثر:
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
على الرغم من أنني أستخدم الواجهة الخلفية للبريد الإلكتروني في الوقت الحالي. التعليق على إرسال وظيفة البريد عند التسجيل حل هذه المشكلة ولكن لا يزال لم يتم إنشاء المستخدم الممتد الخاص بي.
المحلول
قد تكون المشكلة في الطريقة التي تتصل بها بالإشارة؟ في حلي في:
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"])
أيضًا ، أود تشغيل التسجيل للتأكد من أن طريقتك تسمى. يعمل حلي بشكل جيد في الإنتاج ، إذا كنت بحاجة إلى البحث عن تفاصيل أخرى.