AttributeError: объект «кортеж» не имеет атрибута «получить» Django

Я новичок, изучающий django, я проверял несколько раз, но не нашел, где его возвращаемый кортеж вместо словаря может кому-нибудь помочь.

формы.py

from django import forms
from .models import ModelClas

class FormClass(forms.ModelForm):
    passw = forms.CharField(widget=forms.PasswordInput())
    repass = forms.CharField(widget=forms.PasswordInput())

    def clean(self):
        super(FormClass, self).clean()
        inputpass = self.cleaned_data.get('passw')
        inputrepass = self.cleaned_data.get('repass')
        if inputpass != inputrepass:
           raise forms.ValidationError("Password not matched. please type again.")
        return inputpass, inputrepass

    class Meta:
        model = ModelClas
        fields = '__all__'

модели.py

from django.db import models

# Create your models here.
class ModelClas(models.Model):
    fname = models.CharField(max_length=30)
    lname = models.CharField(max_length=30)
    email = models.EmailField()
    mobile = models.IntegerField()
    passw = models.CharField(max_length=30)
    repass = models.CharField(max_length=30)

просмотры.py


def signpage(request):
    if request.method == 'GET':
        form = forms.FormClass()
    if request.method == 'POST':
        form = forms.FormClass(request.POST)
        if form.is_valid():
            print("Validation Successfull")
            print("FName :", form.cleaned_data['fname'])
            print("LName :", form.cleaned_data['lname'])
            print("Email :", form.cleaned_data['email'])
            print("Mobile :", form.cleaned_data['mobile'])
            print("Password :", form.cleaned_data['passw'])
            print("Re-type Password :", form.cleaned_data['repass'])
            form.save(commit=True)
            return HttpResponseRedirect('/accounts/logout')
    return render(request, 'registration/signup.html', {'form':form})

Ошибка. Даже понимание этой ошибки действительно сложно для меня, если кто-нибудь объяснит, было бы здорово

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/signup/

Django Version: 3.0.6
Python Version: 3.6.8
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'UserRegis']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "/home/ashish/.local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/ashish/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/ashish/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/ashish/DjangoProjects/Django/userd/UserRegis/views.py", line 26, in signpage
    if form.is_valid():
  File "/home/ashish/.local/lib/python3.6/site-packages/django/forms/forms.py", line 180, in is_valid
    return self.is_bound and not self.errors
  File "/home/ashish/.local/lib/python3.6/site-packages/django/forms/forms.py", line 175, in errors
    self.full_clean()
  File "/home/ashish/.local/lib/python3.6/site-packages/django/forms/forms.py", line 378, in full_clean
    self._post_clean()
  File "/home/ashish/.local/lib/python3.6/site-packages/django/forms/models.py", line 385, in _post_clean
    exclude = self._get_validation_exclusions()
  File "/home/ashish/.local/lib/python3.6/site-packages/django/forms/models.py", line 345, in _get_validation_exclusions
    field_value = self.cleaned_data.get(field)

Exception Type: AttributeError at /signup/
Exception Value: 'tuple' object has no attribute 'get'

person Ashish Prajapati    schedule 17.07.2020    source источник


Ответы (2)


Ошибка в данных, возвращаемых вашим методом FormClass.clean(). Метод должен возвращать dict с полями формы в качестве ключей или вообще ничего не возвращать (что является неявным return None).

Дополнительная информация: https://docs.djangoproject.com/en/2.2/ref/forms/validation/#validating-fields-with-clean

Мое предложение состоит в том, чтобы просто удалить оператор return из метода:

class FormClass(forms.ModelForm):
    ...

    def clean(self):
        super().clean()

        inputpass = self.cleaned_data.get('passw')
        inputrepass = self.cleaned_data.get('repass')
        if inputpass != inputrepass:
            raise forms.ValidationError("Password not matched. please type again.")

Это должно решить вашу ошибку.

person Ralf    schedule 17.07.2020
comment
спасибо за ваш ответ да я понял это, это совершенно не нужно. - person Ashish Prajapati; 18.07.2020

В этой строке вы возвращаете кортеж, состоящий из вашего inputpass и inputrepass. Почему?

return inputpass, inputrepass

Вместо этого вы должны вернуть cleaned_data:

class FormClass(forms.ModelForm):
    passw = forms.CharField(widget=forms.PasswordInput())
    repass = forms.CharField(widget=forms.PasswordInput())

    def clean(self):
        super(FormClass, self).clean()
        inputpass = self.cleaned_data.get('passw')
        inputrepass = self.cleaned_data.get('repass')
        if inputpass != inputrepass:
           raise forms.ValidationError("Password not matched. please type again.")
        return self.cleaned_data #**FIX HERE**

    class Meta:
        model = ModelClass
        fields = '__all__'
person Ehsan88    schedule 17.07.2020
comment
Спасибо за объяснение, я понял ошибку. - person Ashish Prajapati; 18.07.2020