Проверка Джанго и Пользовательской Формы - PullRequest
16 голосов
/ 28 января 2009

Я пытаюсь создать собственное поле формы и проверить его. Это версия 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 (), я получаю ошибку.

Ответы [ 2 ]

27 голосов
/ 29 января 2009

Если вы просто хотите очистить свое поле, вам не нужно определять совершенно новое поле, вы можете сделать это в методе 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, это делается в подключаемом приложении, которое будет обрабатывать все проверки, создания и настройки пользователей.

Что касается нового создания, то метод clean () вашего поля должен возвращать очищенное значение, а не просто печатать его.

class MyField(forms.CharField):
  def clean(self, value):
    # perform cleaning
    return value
3 голосов
/ 29 января 2009

Это не сработало в 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")
...