Проверка Django и Custom Form
Я пытаюсь создать собственное поле формы и проверить его. Это версия 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)
Теперь я хочу, чтобы проверки по умолчанию min/max_length для CharField были в типе. Но я не могу понять, как это сделать.
Если я поместил какой-либо код в clean(), они не будут проверены. Если я попытаюсь вызвать parent.clean(), я получаю сообщение об ошибке.
Ответы
Ответ 1
Если вы просто хотите очистить свое поле, нет необходимости определять целое новое поле, вы можете сделать это в форме метода 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-registration для регистрации пользователя в Django, это позаботится об этом в подключаемом приложении, которое будет обрабатывать все подтверждение, создание и настройка пользователя для вас.
Что касается нового создания firld, ваш метод clean() поля должен возвращать очищенное значение, а не только его печать.
class MyField(forms.CharField):
def clean(self, value):
# perform cleaning
return value
Ответ 2
Это не работает в 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")