سؤال

لقد وجدت هنا على 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"])

أيضًا ، أود تشغيل التسجيل للتأكد من أن طريقتك تسمى. يعمل حلي بشكل جيد في الإنتاج ، إذا كنت بحاجة إلى البحث عن تفاصيل أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top