2016-07-21 10 views
0

Ich versuche zu überschreiben clean() Methode des Formulars zu überprüfen, ob Attribut IBAN eindeutig ist oder nicht. Jeder user kann IBAN haben. Aus irgendeinem Grund sagt Django, dass die Form kein Attribut IBAN hat, was nicht wahr ist. Wie Sie sehen können, ist dies ein erstes Attribut des Formulars.Exception-Wert: 'Form' Objekt hat kein Attribut 'Attribut'

Wissen Sie, was das Problem ist?

class TranslatorRegistrationForm(forms.Form): 
    IBAN = forms.CharField(max_length=40, required=True) 
    first_name = forms.CharField(max_length=40, required=True) 
    last_name = forms.CharField(max_length=40, required=True) 
    languages = forms.ModelMultipleChoiceField(Language.objects.all(), label='Languages: ', 
               help_text="You can choose from UNKNOWN levels, to gain level, you will be tested") 

    def __init__(self,user,*args, **kwargs): 
     super(TranslatorRegistrationForm, self).__init__(*args, **kwargs) 
     self.user = user 

    def clean(self): 
     cleaned_data = super(TranslatorRegistrationForm, self).clean() 
     if len(UserProfile.objects.filter(IBAN=self.IBAN).exclude(user=self.user))>0: 
      raise ValidationError 
     return cleaned_data 

TRACEBACK:

Umwelt:

Request Method: POST 
Request URL: http://127.0.0.1:8000/register-as-translator/ 

Django Version: 1.8.12 
Python Version: 2.7.10 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'SolutionsForLanguagesApp', 
'crispy_forms', 
'super_inlines', 
'django_tables2', 
'language_tests', 
'smart_selects', 
'django_extensions', 
'constance', 
'constance.backends.database', 
'nested_inline') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware', 
'django.middleware.locale.LocaleMiddleware') 


Traceback: 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\venv\lib\site-packages\django\core\handlers\base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\venv\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view 
    22.     return view_func(request, *args, **kwargs) 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\SolutionsForLanguagesApp\views.py" in register_as_translator 
    110.   if register_as_translator_form.is_valid(): 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\venv\lib\site-packages\django\forms\forms.py" in is_valid 
    184.   return self.is_bound and not self.errors 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\venv\lib\site-packages\django\forms\forms.py" in errors 
    176.    self.full_clean() 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\venv\lib\site-packages\django\forms\forms.py" in full_clean 
    393.   self._clean_form() 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\venv\lib\site-packages\django\forms\forms.py" in _clean_form 
    417.    cleaned_data = self.clean() 
File "C:\Users\Milano\PycharmProjects\FutileStudio\SolutionsForLanguages_2\SolutionsForLanguagesApp\forms.py" in clean 
    116.   if len(UserProfile.objects.filter(IBAN=self.IBAN).exclude(user=self.user))>0: 

Exception Type: AttributeError at /register-as-translator/ 
Exception Value: 'TranslatorRegistrationForm' object has no attribute 'IBAN' 
+0

Können Sie mir Traceback zeigen? – okuznetsov

+0

Ok, ich habe eine Rückverfolgung am Ende der Frage hinzugefügt. –

+1

Sobald Sie 'super (TranslatorRegistrationForm, self) .clean()' aufgerufen haben, sollten Sie in der Lage sein, auf den Wert des IBAN-Feldes in 'cleaned_data ['IBAN']' 'zuzugreifen. Das Attribut 'self.IBAN' ist eine Felddefinition und nicht der Feldwert. Eigentlich mache ich das eine Antwort. – nimasmi

Antwort

3

Da Sie validating the value of a single fieldiban sind, wäre es besser, eine clean_iban Methode zu definieren, anstatt clean:

def clean_iban(self): 
    iban = self.cleaned_data['IBAN'] 
    # Note using exists() is more efficient and pythonic than 'len() > 0' 
    if UserProfile.objects.filter(IBAN=iban).exists(): 
     raise ValidationError('Invalid IBAN') 
    return iban 

Die clean Methode soll für validating fields that depend on each other. Wenn Sie clean überschreiben, können Sie nicht davon ausgehen, dass sich ein Wert in cleaned_data befindet.

def clean(self): 
    cleaned_data = super(TranslatorRegistrationForm, self).clean() 
    if 'iban' in cleaned_data: 
     iban = cleaned_data['iban'] 
     if len(UserProfile.objects.filter(IBAN=self.IBAN).exclude(user=self.user))>0: 
      raise ValidationError('Invalid IBAN') 
    return cleaned_data 
1

Sobald Sie super(TranslatorRegistrationForm, self).clean() genannt haben, sollten Sie in der Lage sein, den Wert des IBAN Feld zuzugreifen in cleaned_data['IBAN']. Das Attribut self.IBAN ist eine Felddefinition und nicht der Feldwert.

+0

Sie können nicht davon ausgehen, dass 'IBAN' in 'cleaned_data' steht. Ihr Code sollte etwas wie 'if' IBAN 'in cleaned_data' oder 'iban = cleaned_data.get (' IBAN ')' verwenden, um einen 'KeyError' zu vermeiden. – Alasdair

+0

@Alasdair Wir müssen davon ausgehen, dass die IBAN beim Überschreiben der clean() -Methode nicht in cleaned_data enthalten sein kann und nicht davon ausgehen, dass, wenn wir die clean_IBAN() -Methode überschreiben (oder erstellen)? (Nach Ihrer Antwort) –

+0

@Milano Ja, das stimmt. Siehe die Dokumentation für ['clean_ '] (https://docs.djangoproject.com/de/1.9/ref/forms/validation/#cleaning-a-specific-field-attribute) und ['clean'] (https : //docs.djangoproject.com/de/1.9/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other), mit dem ich Beispiele und eine Erklärung verlinkte. – Alasdair

Verwandte Themen