2009-01-28 151 views
16

我想創建一個自定義表單域並驗證它。這是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()我得到一個錯誤。

回答

3

這並沒有在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") 
+3

很好的解決方案,壞的問題:-)在你的問題中沒有任何地方能解釋你實際上想要完成的事情。 – 2009-01-29 20:03:29

27

如果你只是想清理你的領域,有沒有需要定義一個全新的領域,你可以這樣做在窗體的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