最近在写一个用户详情表单验证模块时出现了一个问题。我想通过forms表单这个模块,实现前端的表格渲染,(如果有值带值渲染到表格中,如果没有值就渲染为空白),并且可以在提交表格后获得forms模块的表单校验功能。这里就出现一个问题了。。如果有值就带值渲染到页面,这个可以用js或jq来实现。很简单。但是,例如在定义model时有个别的字段是定义为唯一的unique,那么问题来了。如果将当前表再次提交的话,forms验证组件会反馈错误信息,提示该内容已存在了。那么这时候就需要引入一些条件将自己提交的排出(也就是说除自己以外的数据做比较)。
有了这个思路,就要解决如果将forms外部的对象引入到forms中作为field。感觉写这个问题的文章好少,都很麻烦,而且看了以后蒙圈,其实就是那么一回事。。
首先:要让forms可以接收参数。
在form.py中
class PSUserForm(forms.Form): def __init__(self, *args, **kwargs): this_user = kwargs.pop('this_user', None) super(PSUserForm, self).__init__(*args, **kwargs) self.user = this_user
telephone = forms.CharField(max_length=11, error_messages={'required': "该字段不能为空!"}, widget=widgets.TextInput(attrs={"class": "form-control"}), label='电话号码') clean_telephone(self): telephone = self.cleaned_data.get('telephone') telephone_obj = UserDetail.objects.exclude(pk=self.user.userdetail_id).filter(telephone=telephone).first() if not telephone_obj: return telephone else: raise ValidationError('该电话已经被注册!')
其次:传入想要的对象
form = PSUserForm(request.POST, this_user=request.user)
很简单,本身forms验证组件需要传入表单内容进行验证(request.post中就是前端提交的form表单内容),只需要把额外的参数一同传给forms模块就可以了。是不是简单?