2013-11-02 47 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