Подтвердить что ты не робот

Проверка 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(), я получаю сообщение об ошибке.

4b9b3361

Ответ 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")