2013-11-02 217 views
3

在這個問題上過了幾天,我需要你的幫助!Django註冊,自定義註冊和驗證

我需要兩種不同的註冊表格來擴展django註冊表單。

我的urls.py:

from django.conf.urls import patterns, url, include 
from views import RegistrationViewCandidate, RegistrationViewCompany 

urlpatterns = patterns('', 
     url(r'accounts/register/company$', RegistrationViewCompany.as_view(), name='registration_company'), 
     url(r'accounts/register/candidate$', RegistrationViewCandidate.as_view(), name='registration_candidate'), 
     url(r'accounts/', include('registration.backends.default.urls')), 
) 

我views.py:

# -*- coding: utf-8 -*- 
from django.core.urlresolvers import reverse_lazy as _ 
from registration.forms import RegistrationForm 
from registration.views import RegistrationView 
from models import Candidate, Company 
from django import forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Submit, Layout, Field, Fieldset 
from crispy_forms.bootstrap import (PrependedText, PrependedAppendedText, FormActions) 


class CandidateForm(forms.ModelForm): 

    class Meta: 
     model = Candidate 
     fields = ('first_name', 'last_name', 'candidate_city', 'candidate_region', 'candidate_phone', 
        'candidate_birthday','candidate_website_url', 'candidate_github_url') 


class CompanyForm(forms.ModelForm): 

    class Meta: 
     model = Company 
     fields = ('comp_name', 'comp_address', 'comp_email', 'comp_region', 'comp_zip', 'comp_phone', 
        'comp_description', 'comp_city', 'comp_country', 'comp_website_url', 'comp_twitter_url', 
        'comp_fcbk_url') 


class CustomCandidateForm(RegistrationForm): 
    user_class_model = forms.CharField(initial="Candidate", label="user_class_model") 
    first_name = forms.CharField() 
    last_name = forms.CharField() 
    candidate_region = forms.CharField() 
    candidate_city = forms.CharField() 
    candidate_birthday = forms.DateField() 
    candidate_phone = forms.CharField() 
    candidate_website_url = forms.URLField(required=False) 
    candidate_github_url = forms.URLField(required=False) 

    def __init__(self, *args, **kwargs): 
     super(CustomCandidateForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.form_method = 'POST' 
     self.helper.form_class = 'form-horizontal' 
     self.helper.form_action = '' 
     self.helper.label_class = 'col-sm-2' 
     self.helper.field_class = 'col-sm-4' 
     self.helper.layout = Layout(
      Fieldset(
       'Account details', 
       Field('user_class_model'), 
       Field('username', css_class='input-sm'), 
       Field('email', css_class='input-sm'), 
       Field('password1'), 
       Field('password2'), 
      ), 
      Fieldset(
       'Personnal Informations ', 
       Field('first_name', css_class='input-sm'), 
       Field('last_name', css_class='input-sm'), 
       Field('candidate_region', label='Region'), 
       Field('candidate_city', label='City'), 
       Field('candidate_birthday'), 
       Field('candidate_phone'), 
       Field('candidate_website_url'), 
       Field('candidate_github_url'), 
      ), 

     ) 
     self.helper.add_input(Submit('submit', 'Submit', css_class='btn-primary')) 


class CustomCompanyForm(RegistrationForm): 
    user_class_model = forms.CharField(initial="Company", label="user_class_model") 


class RegistrationViewCompany(RegistrationView): 
    form_class = CustomCompanyForm 


class RegistrationViewCandidate(RegistrationView): 
    form_class = CustomCandidateForm 

CustomCandidateForm.base_fields.update(CandidateForm.base_fields) 
CustomCompanyForm.base_fields.update(CompanyForm.base_fields) 

就像你看到的,我向RegistrationView和RegistrationForm。 我的問題是在這條線:

self.helper.form_action = '' 

有了這個參數form_action,如果我在我的形式錯誤,我與有關錯誤的領域引發錯誤的形式重定向。完美的,但如果我沒有錯誤,在我的表格(如果我的形式是乾淨的),Django的註冊提出這個錯誤:

NotImplementedError at /user/accounts/register/candidate 

No exception supplied 

Request Method:  POST 
Request URL: http://127.0.0.1:8000/user/accounts/register/candidate 
Django Version:  1.5.4 
Exception Type:  NotImplementedError 
Exception Location:  /home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/registration/views.py in register, line 109 
Python Executable: /home/damien/Developpements/Django/virtualenv/bin/python2.7 
Python Version:  2.7.4 
Python Path:  

['/home/damien/Developpements/Django/virtualenv/site_web/linuxemploi', 
'/home/damien/Developpements/Django/virtualenv/site_web/linuxemploi', 
'/home/damien/Developpements/Django/virtualenv/lib/python2.7', 
'/home/damien/Developpements/Django/virtualenv/lib/python2.7/plat-x86_64-linux-gnu', 
'/home/damien/Developpements/Django/virtualenv/lib/python2.7/lib-tk', 
'/home/damien/Developpements/Django/virtualenv/lib/python2.7/lib-old', 
'/home/damien/Developpements/Django/virtualenv/lib/python2.7/lib-dynload', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-x86_64-linux-gnu', 
'/usr/lib/python2.7/lib-tk', 
'/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages'] 

Server time: sam, 2 Nov 2013 14:47:26 +0100 

Traceback: 
File "/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/django/views/generic/base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 
File "/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/registration/views.py" in dispatch 
    79.   return super(RegistrationView, self).dispatch(request, *args, **kwargs) 
File "/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch 
    86.   return handler(request, *args, **kwargs) 
File "/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/registration/views.py" in post 
    35.    return self.form_valid(request, form) 
File "/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/registration/views.py" in form_valid 
    82.   new_user = self.register(request, **form.cleaned_data) 
File "/home/damien/Developpements/Django/virtualenv/lib/python2.7/site-packages/registration/views.py" in register 
    109.   raise NotImplementedError 

Exception Type: NotImplementedError at /user/accounts/register/candidate 
Exception Value: 

如果我把:

self.helper.form_action = '.' 

我沒有錯誤通過django註冊,但如果我有一個錯誤在我的形式(表格不乾淨),我重定向/用戶/帳戶/登記而不是/用戶/帳戶/登記* /候選 *或/公司

任何想法?

非常感謝

回答

2

距離異常簡單,你必須實現register(request, **form.cleaned_data)方法在RegistrationViewCandidate類。此方法必須實現自定義的註冊邏輯處理,因此不Django中註冊RegistrationView

也許,你想修改現有的實現來實現,從django-registrationsimple後端說。那麼你應該從registration.backends.simple.views分類RegistratioView而不是你從registration.views

+0

是啊謝謝! 高清get_form_class(個體經營,請求): 回報CustomCandidateForm 高清登記(個體經營,要求** cleaned_data): 如果Site._meta.installed: 網站= Site.objects我在RegistrationViewCandidate(RegistrationView)添加類.get_current() else: site = RequestSite(請求) new_user = RegistrationProfile.objects.create_inactive_user(cleared_data ['username'],cleaned_data ['email'],cleared_data ['password1'],site) signals.user_registered .send(sender = self .__ class __,user = new_user,request = request) return new_user – user2947856