2012-04-27 3 views
0

Я использую приложение регистрации django. и имеет следующий код в forms.pyошибка преодоления метода сохранения при расширении приложения регистрации 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) он говорит, что сохранить атрибут оленьей кожи существовать. Я на самом деле написал этот код с наследованием от 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. 

""" 

Этих комментарии просит не определить другой способ сохранить, но мне нужно. Таким образом, я могу определить метод сохранения и вызвать метод родительского сохранения, чтобы определить дополнительные поля? Ниже приведен код forms.py Джанго регистрации APPS'S:

""" 
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'] 

Я просто хочу знать, что, как я могу переопределить метод сохранения() или же, как я могу создать новые дополнительные поля?

+0

пытался импортировать только регистрационную форму? –

+0

@FrantzdyRomain Я импортирую и использую этот 'from registration.forms import RegistrationFormUniqueEmail', а также наследующий от' RegistrationFormUniqueEmail', и в комментариях к файлу они просят избежать определения save(), а если я не определяю save(), то как я могу добавить дополнительные поля в свой UserRegistrationForm? Я также импортировал registerForm, используя 'from registration.forms import RegistrationForm', но все же ошибка' super 'объекта не имеет атрибута' save'' – Hafiz

+0

Попробуйте удалить этот def __init__ –

ответ

1

Я нашел решение моих публикуемых проблем:

Я удалил этот RegistrationFormUniqueEmail Джанго-регистрирующее приложения, а вместо этого я унаследовав от UserCreationForm и добавил нужный метод в мой собственный UserRegistrationForm, так что я могу переопределить сохранить метод и сделать то, что я хотел.