如何在Django中使用表单中的自定义方法发送请求并接受来自另一台服务器的响应?

如何在Django中使用表单中的自定义方法发送请求并接受来自另一台服务器的响应?,django,forms,methods,Django,Forms,Methods,我的forms.py文件中有以下代码 class RegisterForm(forms.Form): employee_id = forms.CharField(label='Employee ID', max_length=30) password1 = forms.CharField(label='Password', widget=forms.PasswordInput) password2 = forms.CharField(label='Retype Passw

我的
forms.py
文件中有以下代码

class RegisterForm(forms.Form):
    employee_id = forms.CharField(label='Employee ID', max_length=30)
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Retype Password', widget=forms.PasswordInput)

    first_name = forms.CharField(label='First Name', max_length=100)
    last_name = forms.CharField(label='Last Name', max_length=100)
    designation = forms.CharField(max_length=100)
    department = forms.ChoiceField(choices=[(x, x) for x in departments])
    mobile = forms.CharField(max_length=50)

    def clean_password2(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2:
            if password1 != password2:
                raise forms.ValidationError(("The two password fields didn't match."))
            elif password1 == '' or password2 == '':
                raise forms.ValidationError(("The password cannot be blank"))
        return password2
我有两个问题

  • 我理解
    clean_password2
    方法中的代码是如何工作的,但我不理解为什么该方法被称为
    clean_password2
    ,如果我从名称中删除
    2
    ,为什么它不工作

  • 我在另一台服务器上有一个脚本,我想在那里发送一个带有
    employee\u id
    的请求,并得到一个响应,无论该id是否可用或已经存在。如何创建一个不允许我在ID不可用的情况下提交表单的方法


  • 另外,如果有人给我提供阅读材料,让我对Django表单有一个清晰的了解,那将非常有帮助

    1) 在文档中

    在表单子类上调用
    clean\ux()
    方法,其中
    替换为表单字段属性的名称。此方法执行特定于该特定属性的任何清理,与它所属的字段类型无关。此方法未传递任何参数。您需要在self.cleaned_数据中查找字段的值,记住此时它将是一个Python对象,而不是表单中提交的原始字符串(它将在cleaned_数据中,因为上面的general field clean()方法已经清理过一次数据)

    这意味着只有当该验证方法具有相应字段时,才会调用以clean开头的验证方法。这就是为什么
    password2
    有效而
    password
    无效的原因

    2) 您可以使用
    清洁
    执行此操作。下面是一个例子

    def clean_employee_id(self):
        value = self.cleaned_data['employee_id']
        # send request to your remote server. I would suggest using requests library
        if remote_check_is_successful:
            return value
        raise ValidationError('invalid employee_id')
    

    考虑到除了验证本身之外,可能还有一些网络错误,另外,如果远程服务器回复速度慢,表单提交将花费很长时间,这对用户来说不是很友好。但这又是一个问题,对于django来说,大多数可靠的文档都是官方的,而且

    1) 在文档中

    在表单子类上调用
    clean\ux()
    方法,其中
    替换为表单字段属性的名称。此方法执行特定于该特定属性的任何清理,与它所属的字段类型无关。此方法未传递任何参数。您需要在self.cleaned_数据中查找字段的值,记住此时它将是一个Python对象,而不是表单中提交的原始字符串(它将在cleaned_数据中,因为上面的general field clean()方法已经清理过一次数据)

    这意味着只有当该验证方法具有相应字段时,才会调用以clean开头的验证方法。这就是为什么
    password2
    有效而
    password
    无效的原因

    2) 您可以使用
    清洁
    执行此操作。下面是一个例子

    def clean_employee_id(self):
        value = self.cleaned_data['employee_id']
        # send request to your remote server. I would suggest using requests library
        if remote_check_is_successful:
            return value
        raise ValidationError('invalid employee_id')
    

    考虑到除了验证本身之外,可能还有一些网络错误,另外,如果远程服务器回复速度慢,表单提交将花费很长时间,这对用户来说不是很友好。但对于阅读材料来说,这是另一个问题——django docs是最好的来源。例如,请参见

    在表单子类上调用
    clean\ux()
    方法,其中
    替换为表单字段属性的名称。 此方法可执行特定于该特定对象的任何清洁 属性,与它所属的字段类型无关


    因此,将调用clean_password2方法来验证password2字段。没有“2”它无法工作,因为表单没有“密码”字段。如果您想要对validate employee_id字段进行自定义验证,则需要将其置于clean_employee_id方法中。

    至于阅读材料,django docs是最好的来源。例如,请参见

    在表单子类上调用
    clean\ux()
    方法,其中
    替换为表单字段属性的名称。 此方法可执行特定于该特定对象的任何清洁 属性,与它所属的字段类型无关

    因此,将调用clean_password2方法来验证password2字段。没有“2”它无法工作,因为表单没有“密码”字段。如果您想要对validate employee_id字段进行自定义验证,则需要将其放入clean_employee_id方法中