2011-04-14 15 views
7

मैं django-पंजीकरण का उपयोग कर रहा हूं और मैं स्वचालित रूप से उपयोगकर्ता प्रोफाइल बनाने के लिए अपने संकेतों से कनेक्ट करने का प्रयास कर रहा हूं।django-पंजीकरण ऑटो उपयोगकर्ता उपयोगकर्ता प्रोफाइल

सिग्नल परिभाषा:

from django.dispatch import Signal 

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

सिग्नल Django पंजीकरण द्वारा भेजें:

def register(self, request, **kwargs): 
    """ 
    Create and immediately log in a new user. 

    """ 
    username, email, password = kwargs['username'], kwargs['email'], kwargs['password1'] 
    User.objects.create_user(username, email, password) 

    # authenticate() always has to be called before login(), and 
    # will return the user we just created. 
    new_user = authenticate(username=username, password=password) 
    login(request, new_user) 
    signals.user_registered.send(sender=self.__class__, 
           user=new_user, 
           request=request) 
    return new_user 

मेरे संकेत कनेक्ट:

from registration.signals import * 
from core.models import UserProfile 
from django.contrib.auth.models import User 

def createUserProfile(sender, instance, **kwargs): 
    UserProfile.objects.get_or_create(user=instance) 

user_registered.connect(createUserProfile, sender=User) 

कोई UserProfile कहने की जरूरत नहीं बनाया जा रहा है। मुझे यहां क्या समझ नहीं आ रहा है?

बहुत बहुत धन्यवाद!

संपादित करें: मैंने अपना कनेक्ट() और इसकी इसी विधि को model.py पर ले जाया और अभी भी कोई भाग्य नहीं है।

नए कोड:

from django.db import models 

from django.contrib import auth 
from django.contrib.auth import login 
from core.forms import AuthForm 
from registration.signals import * 
from django.contrib.auth.models import User 


# Create your models here. 

class UserProfile(models.Model) : 
    user = models.ForeignKey(User, unique=True) 

    def __unicode__(self): 
     return self.user.username 


def createUserProfile(sender, instance, **kwargs): 
    print "creating profile" 
    UserProfile.objects.get_or_create(user=instance) 

user_registered.connect(createUserProfile, sender=User) 

मैं Pycharm उपयोग कर रहा हूँ डिबग करने के लिए, और user_registered.connect पर मेरे ब्रेकप्वाइंट बहुत शुरुआत में() मारा जाता है। तो मुझे लगता है कि कनेक्ट() सही ढंग से पंजीकृत किया जा रहा है। हालांकि, मुझे अभी भी createUserProfile चलाने के लिए नहीं दिख रहा है। मैं और कुछ और याद कर रहा हूँ?

धन्यवाद!

उत्तर: दोह। मेरा कनेक्ट और रिसीवर कोड गलत था। सही कोड:

def createUserProfile(sender, user, request, **kwargs): 
UserProfile.objects.get_or_create(user=user) 

user_registered.connect(createUserProfile) 

यह एहसास के बाद मैं एक मॉड्यूल है जो सर्वर स्टार्टअप पर आयात किया जाता है में Django पंजीकरण में signals.py पढ़

उत्तर

6

आप रजिस्टर करने की आवश्यकता (कनेक्ट) अपने संकेत। आपकी फ़ाइल जहां user_registered.connect(createUserProfile, sender=User) जीवन स्टार्टअप पर आयात की संभावना नहीं है। Django दस्तावेज़ों से:

आप कहीं भी सिग्नल हैंडलिंग और पंजीकरण कोड डाल सकते हैं। हालांकि, आपको यह सुनिश्चित करना होगा कि उस मॉड्यूल में पर आयात किया जाता है ताकि सिग्नल हैंडलिंग को भेजे जाने से पहले किसी सिग्नल की आवश्यकता हो। यह आपके ऐप के models.py को सिग्नल हैंडलर के पंजीकरण के लिए एक अच्छी जगह बनाता है।

http://docs.djangoproject.com/en/dev/topics/signals/#connecting-receiver-functions

तो अपने कस्टम अनुप्रयोग के models.py

एक अच्छी जगह (या किसी अन्य मॉड्यूल जो निश्चित रूप से सर्वर स्टार्टअप पर आयात किया जाता है) होगा।

+0

मैंने अपना कोड आपके उत्तर के अनुसार बदल दिया, लेकिन अभी भी कोई भाग्य नहीं है। कृपया मेरे संपादन की जांच करें। आपका बहुत बहुत धन्यवाद! – rabbid

2

टॉरस्टेन सही है:

from registration.signals import user_registered 
    # ... 
    @receiver(user_registered) 
    def your_function_name_here(sender, user, request, **kwargs): 
      # your code here 
      pass 

मैं इस तरह की तरह है, क्योंकि यह कॉम्पैक्ट और पठनीय है: वैकल्पिक तरीका decorators उपयोग करने के लिए के रूप में documentation में कहा गया है।

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

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