2010-06-25 16 views
8

का उपयोग करके डीजेंगो-पंजीकरण का विस्तार करना मैंने सिंकल का उपयोग करके नए क्षेत्रों के साथ django-पंजीकरण का विस्तार करने के लिए एक समाधान स्टैक ओवरफ्लो पर पाया है। यहां लिंक है: http://dmitko.ru/?p=546
मैंने विस्तारित प्रोफाइल मॉडल, विस्तारित फॉर्म बनाया है, सेटिंग में आवश्यक विकल्प जोड़े हैं, परिभाषित यूआरएल और उचित रूप प्रदर्शित किया गया है लेकिन केवल सामान्य उपयोगकर्ता (ऑथ मॉड्यूल से) बनाया गया है। ऐसा क्यों हो रहा है?सिग्नल

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 जरूरत सार होने के लिए के रूप में अन्य मॉडलों में एक ही क्षेत्रों का प्रयोग करेंगे।

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

संपादित करें: इंडेंटेशन

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

और विकल्प सेटिंग्स को जोड़ा गया user_created चा कुछ भी नहीं nges जब तक मैं बदल रहा

user_registered.connect(user_created) 

को
user_registered.connect(user_created, sender=UserProfile) 

अब मैं हो रही थी की कोशिश की है:
"SMTPServerDisconnected
अपवाद स्थान: /bin/python-2.6.1/lib/ getyply में python2.6/smtplib.py, लाइन 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 

भले ही मैं इस समय डमी ईमेल बैकएंड का उपयोग कर रहा हूं। पंजीकरण पर मेल फ़ंक्शन भेजने पर टिप्पणी करते हुए इस समस्या को हल किया गया लेकिन फिर भी मेरा विस्तारित उपयोगकर्ता नहीं बनाया गया है।

उत्तर

11

समस्या हो सकती है कि आप सिग्नल से कैसे जुड़ते हैं? मेरी समाधान में में था:

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

इसके अलावा, मैं सुनिश्चित करें कि आपके विधि कहा जाता है प्रवेश पर स्विच होगा। मेरा समाधान उत्पादन में ठीक काम करता है, अगर आपको जरूरत है तो मैं अन्य विवरण देख सकता हूं।

+0

नहीं, ध्यान से देखो। मेरा कार्य उसी तरह से जुड़ता है। मैंने अभी उपयोगकर्ता_registered सिग्नल के कोड प्रदान किया है। मैंने यहां अपने उपयोगकर्ता के साथ विरासत से संबंध विधि में स्विच किया है: http://stackoverflow.com/questions/3124052/models-does-not-create-tables-when-synched और इस फ़ंक्शन का कोड किसी भी तरह से मेरी टेबल का निर्माण अवरुद्ध करता है । आपने यह फ़ंक्शन कहां रखा है? और इस सिग्नल से कनेक्ट करते समय प्रेषक को यह नहीं देना चाहिए? – crivateos

+0

मैंने इस फ़ंक्शन को एक अलग फ़ाइल में ले जाया है। अब मेरी टेबल बनाई गई हैं लेकिन फिर भी मुझे कोई विस्तारित उपयोगकर्ता प्रोफाइल नहीं मिला है। – crivateos

+2

यह कोड फ़ाइल 'regbackend.py' में है जो urls.py के समान स्तर पर है और मिलान पैटर्न से पहले urls.py में आयात किया जाता है। यह कोड सीधे regbackend से कॉपी किया गया है।पाई (इसलिए प्रेषक प्रदान किया जाता है) और इस फ़ाइल में कुछ और नहीं है। – dmitko

संबंधित मुद्दे