【问题标题】:AttributeError: 'tuple' object has no attribute 'get' DjangoAttributeError: 'tuple' 对象没有属性 'get' Django
【发布时间】:2020-11-07 06:08:59
【问题描述】:

我是一个学习 django 的初学者,我已经检查了很多次,但没有找到它返回的元组而不是字典的位置,任何人都可以提供帮助。

forms.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__'

models.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)

views.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'

【问题讨论】:

    标签: python-3.x django django-models django-forms django-validation


    【解决方案1】:

    错误出现在您的方法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.")
    

    这应该可以解决您的错误。

    【讨论】:

    • 感谢您的回复,是的,我意识到了,这完全没有必要。
    【解决方案2】:

    在这一行中,您将返回一个由 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__'
    

    【讨论】:

    • 感谢您的解释,我理解了这个错误。
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2015-06-22
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多