Django - 条件必填字段

时间:2018-03-30 01:34:31

标签: django django-forms

我有一个Django表单来捕获用户名/密码和登录按钮。显然,我需要用户名/密码是强制性的。

我还希望在同一表单上有一个注册按钮,其中用户名/密码字段不是必需的。

如何以依赖于已按下的按钮的方式验证表单。

通常,对表单clean方法进行验证,但clean方法无法访问所选按钮 - 只输入输入的字段。

1 个答案:

答案 0 :(得分:0)

我已经发现了答案 - 在官方文件中没有很好地记录 - 所以这里是:

在表单上的clean方法内以及可以访问已清理数据的情况下,程序还可以访问self.data这是未清除的数据 - 即隐藏字段和可用按钮(清理过的数据只有输入字段可用,但没有input type="submit"按钮 - 所以我的html表单有(大约):

<form method="post" action="" >                    
    <table>                
        <tr>
           <th><label for="id_username">Username:</label></th>
            <input type="text" name="username" id="id_username" maxlength="30" /></td></tr>
        <tr>
           <th><label for="id_password">Password:</label></th><input type="password" name="password" id="id_password" /></td></tr>
        <tr>
            <td><input type='submit' name='register' value='Register'/></td>
            <td><input type='submit' name='submit' value='Sign In'/></td>
        </tr>
    </table>
</form>

以我的Django形式 - 干净的方法是:

def clean(self):
    cleaned_data = super().clean()
    register = self.data.get('register')
    signin = self.data.get('submit')

    if signin:
        if not (cleaned_data.get('username') and cleaned_data.get('password')):
             self.add_error('username', 'Must provide your scouts.org.uk Username to sign in')
             self.add_error('password', 'Must provide your scouts.org.uk password to sign in')

        return cleaned_data
    elif register:
        return cleaned_data

请注意使用self.data访问按钮的表单数据