Django和自定义表单验证
问题描述:
我想创建一个自定义表单域并验证它。这是Django的1.0版本。Django和自定义表单验证
这里是我的表单对象
class UsernameField(forms.CharField):
def clean(self, values):
print ""
这是我如何把它
class RegisterForm(forms.Form):
username = UsernameField(max_length=30, min_length=4)
password = forms.CharField(widget = forms.PasswordInput(), min_length=5)
password2 = forms.CharField(widget = forms.PasswordInput(), min_length=5)
email = forms.EmailField(max_length=75)
现在我想保持默认的最小/ MAX_LENGTH检查在粘性一个CharField ..但我可以似乎没有想到如何做到这一点。
如果我把任何代码放到clean()中,那些不会被检查。如果我尝试调用parent.clean()我得到一个错误。
答
这并没有在1.0的工作...这里是我如何解决它
class UsernameField(forms.CharField):
def clean(self, request, initial=None):
field = super(UsernameField, self).clean(request)
from django.contrib.auth.models import User
user = User(username=request)
if user is not None:
raise forms.ValidationError("That username is already taken")
答
如果你只是想清理你的领域,有没有需要定义一个全新的领域,你可以这样做在窗体的clean_username方法
class RegisterForm(forms.Form):
username = forms.CharField(max_length=30, min_length=4)
...
...
def clean_username(self):
username = self.cleaned_data['username']
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(u'%s already exists' % username)
def clean(self):
# Here you'd perform the password check
...
您也可以考虑在Django使用django-registration用于用户注册,它需要护理的这种可插拔的应用程序,这将处理所有的用户验证,创建和设置你。
至于新的firld创建,你的字段的clean()方法应该返回一个已清除的值,而不仅仅是打印它。
class MyField(forms.CharField):
def clean(self, value):
# perform cleaning
return value
很好的解决方案,坏的问题:-)在你的问题中没有任何地方能解释你实际上想要完成的事情。 – 2009-01-29 20:03:29