2014-10-22 7 views
5

का उपयोग करके पंजीकरण के बाद सीधे उपयोगकर्ता को कैसे लॉगिन करें django जेनेरिक CreateView के साथ मैं एक नया उपयोगकर्ता खाता बना सकता हूं, लेकिन मैं इस तकनीक का उपयोग करके पंजीकरण के बाद स्वचालित रूप से इस उपयोगकर्ता को कैसे लॉगिन कर सकता हूं?Django: जेनेरिक CreateView

urls.py ...
यूआरएल (आर '^ साइनअप/$', SignUpView.as_view(), name = 'user_signup'), ...

views.py

class SignUpView (CreateView) :  
    form_class = AccountCreationForm 
    template_name = 'accounts/signup.html' 
    success_url = reverse_lazy('home') 

forms.py

class AccountCreationForm (forms.ModelForm) :   
    def __init__(self, *args, **kwargs) : 
     super(AccountCreationForm, self).__init__(*args, **kwargs) 
     for field in self.fields : 
      self.fields[field].widget.attrs['class'] = 'form-control' 

    password1 = forms.CharField(label = 'Password', widget = forms.PasswordInput) 
    password2 = forms.CharField(label = 'Password confirmation', widget = forms.PasswordInput) 

    class Meta : 
     model = User 
     fields = ('email', 'first_name',) 

    def clean_password2 (self) : 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password 

    def save(self, commit = True) : 
     # Save the provided password in hashed format 
     user = super(AccountCreationForm, self).save(commit = False) 
     user.set_password(self.cleaned_data[ "password1" ]) 
     if commit: 
      user.save() 
     return user 

उत्तर

9

यह शायद देर हो चुकी है, लेकिन वह वास्तव में मेरे सवाल का था, और अंत में संघर्ष कर यह पता लगाने के कुछ घंटों के बाद ।

शायद आपको मिला लेकिन यदि अन्य लोग समाधान ढूंढ रहे हैं, तो यह मेरा है।

आपको अपनी कक्षा विरासत CreateView में form_valid() ओवरराइड करना होगा।

class CreateArtistView(CreateView): 
    template_name = 'register.html' 
    form_class = CreateArtistForm 
    success_url = '/' 

    def form_valid(self, form): 
     valid = super(CreateArtistView, self).form_valid(form) 
     username, password = form.cleaned_data.get('username'), form.cleaned_data.get('password1') 
     new_user = authenticate(username=username, password=password) 
     login(self.request, new_user) 
     return valid 

मैं पहली बार form.save(), जिसमें अपने उपयोगकर्ता रजिस्टर valid में मेरे माता-पिता वर्ग विधि form_valid() का मूल्य पकड़ने, क्योंकि जब आप यह कहते हैं, यह कहता है: यहाँ अपने ही वर्ग के साथ उदाहरण है डेटाबेस और उपयोगकर्ता द्वारा बनाए गए self.object को पॉप्युलेट करें।

उसके बाद मुझे अपने प्रमाणीकरण के साथ एक लंबी समस्या थी, None लौट रहा था। ऐसा इसलिए है क्योंकि मैं dzango पासवर्ड धोने के साथ authenticate() पर कॉल कर रहा था, और फिर इसे हैश प्रमाणीकृत करता हूं।

यह समझने के लिए कि मैं form.cleaned_data.get('username') का उपयोग क्यों करता हूं और self.object.username का उपयोग नहीं करता हूं।

मुझे आशा है कि यह आपको या अन्य की मदद करेगा, क्योंकि मुझे नेट पर स्पष्ट उत्तर नहीं मिला है।

+0

हां, यह वही समाधान है जिसे मैंने ढूंढने के लिए प्रबंधित किया है। मैंने प्रमाणित करने के लिए हैश पास का उपयोग करने का प्रयास करने में भी कुछ समय खो दिया)) –

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