【问题标题】:Django cleaned_data.get('obj') method returns noneDjango clean_data.get('obj') 方法返回无
【发布时间】:2018-10-02 03:37:53
【问题描述】:

我正在 django 中做一个小密码确认表单。但我很困惑,因为 self.cleaned_data.get('confirm_password') 总是不返回任何内容,因此我的密码永远不会相互匹配。

这是forms.py 中的clean 方法

def clean_password(self):
    password = self.cleaned_data.get("password")
    confirm_password = self.cleaned_data.get("confirm_password")
    if password != confirm_password:
        print(password)
        print(confirm_password)
        raise forms.ValidationError(
        "Password and password confirmation does not match"
        )
    return password

self.cleaned_data.get('password') 返回输入的密码,但确认密码不返回。

view.py看到清理前收到的数据时,confirm_password显示为原样

......................user = UserRegister(request.POST)
        print(request.POST.get('confirm_password'))

        if user.is_valid():
            print('valid')..........................

这可能是什么原因??

这是forms.py中的表单声明部分

first_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'First Name'}))
last_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Last Name'}))
username = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Username'}))
email = forms.EmailField( required=True, widget=forms.widgets.EmailInput(attrs={'placeholder': 'Email'}))
password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())
confirm_password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())

class Meta:
    model=User
    fields=['first_name','last_name','username','email','password','confirm_password']

【问题讨论】:

    标签: python django django-models django-forms django-2.0


    【解决方案1】:

    clean_fieldname 方法按字段声明的顺序调用,所以目前clean_password 被调用cleaned_data 不包含confirm_password。您可以在clean_confirm_password 方法中执行此验证:

    def clean_confirm_password(self):
        password = self.cleaned_data.get("password")
        confirm_password = self.cleaned_data.get("confirm_password")
        if password != confirm_password:
            print(password)
            print(confirm_password)
            raise forms.ValidationError(
            "Password and password confirmation does not match"
            )
        return password
    

    或者只是使用clean 方法进行需要访问多个表单字段的验证。

    【讨论】:

    • 非常感谢。干杯伙伴。
    【解决方案2】:

    在验证字段时调用clean_<fieldname>() 方法。除了您正在使用的字段之外,您不能指望当时在cleaned_data 中的任何其他字段。如果您需要处理多个字段,请覆盖表单的 clean() 方法。

    【讨论】:

      【解决方案3】:

      由于您在多个字段之间进行验证,因此您应该覆盖表单的 cleanmethod。

      def clean(self):
          cleaned_data = super().clean()
          password = self.cleaned_data.get("password")
          confirm_password = self.cleaned_data.get("confirm_password")
          if password != confirm_password:
              print(password)
              print(confirm_password)
              raise forms.ValidationError(
              "Password and password confirmation does not match"
              )
          return cleaned_data
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多