2012-04-27 38 views
0

我正在使用django註冊應用程序。並在forms.py錯誤overiding保存方法,同時擴展Django註冊應用程序

from django.contrib.auth.forms import UserCreationForm 
from registration.forms import RegistrationFormUniqueEmail 
from django import forms 
from django.contrib.auth.models import User 
from accounts.models import UserProfile 
from pprint import pprint 


class UserRegistrationForm(RegistrationFormUniqueEmail): 
    #email = forms.EmailField(label = "Email") 
    fullname = forms.CharField(label = "Full name") 

    class Meta: 
     model = User 
     fields = ("fullname", "email",) 

    def __init__(self, *args, **kwargs): 
     super(UserRegistrationForm, self).__init__(*args, **kwargs) 
     del self.fields['username'] 

    def save(self, commit=True): 
     user = super(UserRegistrationForm, self).save(commit=False) 
     user.userprofile.full_name = self.cleaned_data["fullname"] 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 

下面的代碼,我從我這麼叫的時候保存方法Django的registraion應用程序的類繼承RegistrationFormUniqueEmail在user = super(UserRegistrationForm, self).save(commit=False)它說,這SAVE屬性不列入存在。我實際上是從UserCreationForm繼承而來的。 我剛纔讀的是RegistrationFormUniqueEmail的超類中的註釋:

""" 
Form for registering a new user account. 

Validates that the requested username is not already in use, and 
requires the password to be entered twice to catch typos. 

Subclasses should feel free to add any additional validation they 
need, but should avoid defining a ``save()`` method -- the actual 
saving of collected user data is delegated to the active 
registration backend. 

""" 

這些意見請不要定義另一個保存方法,但我需要。那麼有沒有辦法可以定義保存方法並調用父保存方法來定義附加字段?以下是Django的註冊應用程序的forms.py的代碼:

""" 
Forms and validation code for user registration. 

""" 


from django.contrib.auth.models import User 
from django import forms 
from django.utils.translation import ugettext_lazy as _ 


# I put this on all required fields, because it's easier to pick up 
# on them with CSS or JavaScript if they have a class of "required" 
# in the HTML. Your mileage may vary. If/when Django ticket #3515 
# lands in trunk, this will no longer be necessary. 
attrs_dict = {'class': 'required'} 


class RegistrationForm(forms.Form): 
    """ 
    Form for registering a new user account. 

    Validates that the requested username is not already in use, and 
    requires the password to be entered twice to catch typos. 

    Subclasses should feel free to add any additional validation they 
    need, but should avoid defining a ``save()`` method -- the actual 
    saving of collected user data is delegated to the active 
    registration backend. 

    """ 
    username = forms.RegexField(regex=r'^[\[email protected]+-]+$', 
           max_length=30, 
           widget=forms.TextInput(attrs=attrs_dict), 
           label=_("Username"), 
           error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")}) 
    email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict, 
                   maxlength=75)), 
          label=_("E-mail")) 
    password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), 
           label=_("Password")) 
    password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), 
           label=_("Password (again)")) 

    def clean_username(self): 
     """ 
     Validate that the username is alphanumeric and is not already 
     in use. 

     """ 
     existing = User.objects.filter(username__iexact=self.cleaned_data['username']) 
     if existing.exists(): 
      raise forms.ValidationError(_("A user with that username already exists.")) 
     else: 
      return self.cleaned_data['username'] 

    def clean(self): 
     """ 
     Verifiy that the values entered into the two password fields 
     match. Note that an error here will end up in 
     ``non_field_errors()`` because it doesn't apply to a single 
     field. 

     """ 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise forms.ValidationError(_("The two password fields didn't match.")) 
     return self.cleaned_data 


class RegistrationFormTermsOfService(RegistrationForm): 
    """ 
    Subclass of ``RegistrationForm`` which adds a required checkbox 
    for agreeing to a site's Terms of Service. 

    """ 
    tos = forms.BooleanField(widget=forms.CheckboxInput(attrs=attrs_dict), 
          label=_(u'I have read and agree to the Terms of Service'), 
          error_messages={'required': _("You must agree to the terms to register")}) 


class RegistrationFormUniqueEmail(RegistrationForm): 
    """ 
    Subclass of ``RegistrationForm`` which enforces uniqueness of 
    email addresses. 

    """ 
    def clean_email(self): 
     """ 
     Validate that the supplied email address is unique for the 
     site. 

     """ 
     if User.objects.filter(email__iexact=self.cleaned_data['email']): 
      raise forms.ValidationError(_("This email address is already in use. Please supply a different email address.")) 
     return self.cleaned_data['email'] 


class RegistrationFormNoFreeEmail(RegistrationForm): 
    """ 
    Subclass of ``RegistrationForm`` which disallows registration with 
    email addresses from popular free webmail services; moderately 
    useful for preventing automated spam registrations. 

    To change the list of banned domains, subclass this form and 
    override the attribute ``bad_domains``. 

    """ 
    bad_domains = ['aim.com', 'aol.com', 'email.com', 'gmail.com', 
        'googlemail.com', 'hotmail.com', 'hushmail.com', 
        'msn.com', 'mail.ru', 'mailinator.com', 'live.com', 
        'yahoo.com'] 

    def clean_email(self): 
     """ 
     Check the supplied email address against a list of known free 
     webmail domains. 

     """ 
     email_domain = self.cleaned_data['email'].split('@')[1] 
     if email_domain in self.bad_domains: 
      raise forms.ValidationError(_("Registration using free email addresses is prohibited. Please supply a different email address.")) 
     return self.cleaned_data['email'] 

我只是想知道我怎麼可以覆蓋save()方法,否則我怎麼能創造新的附加字段?

+0

試過只導入RegistrationForm? – 2012-04-27 17:08:05

+0

@FrantzdyRomain我導入並使用這個'從registration.forms導入RegistrationFormUniqueEmail'並且還從'RegistrationFormUniqueEmail'繼承,並且在它們的文件註釋中他們要求避免定義save(),而如果我沒有定義save(),那麼我怎麼能添加更多的字段到我的UserRegistrationForm?我也導入registrationForm使用'從registration.forms導入RegistrationForm'但仍然錯誤是'超'對象沒有屬性'保存' – Hafiz 2012-04-27 17:16:12

+0

嘗試刪除def def__init__ – 2012-04-27 17:39:47

回答

1

我發現我自己貼的問題的解決方案:

我已經刪除了Django的註冊應用程序的RegistrationFormUniqueEmail,而是我從UserCreationForm繼承並添加所需的方法到我自己的UserRegistrationForm所以我能夠覆蓋節省方法,並能夠做我想做的事情。