Django проверка формы на ПИН-код - PullRequest
0 голосов
/ 30 апреля 2020

В моей ModelForm есть поле Integer, которое должно содержать данные между 100000 и 999999. Возникли проблемы при проверке. Я перепробовал множество комбинаций, но это не помогло.

from django.forms import ValidationError

class myForm(forms.ModelForm):
    pin = forms.IntegerField(label="PIN : ", required=True)

    def clean(self):
        if self.cleaned_data.get('pin') <= 999999 & self.cleaned_data.get('pin') >= 100000:
            try:
                return int(self.cleaned_data['pin'].strip())
            except ValueError:
                raise ValidationError("Invalid number")

Моя модель такая, как показано ниже:

from django.core.validators import MaxValueValidator, MinValueValidator

class Company(models.Model):
     comppin = models.PositiveIntegerField(
        validators=[MinValueValidator(100000), MaxValueValidator(999999)])

Мой взгляд ниже:

def company_form(request, id=0):
    if request.method == 'GET':
        if id == 0:
            form = CompanyForm()
        else:
            company = Company.objects.get(pk=id)
            form = CompanyForm(instance = company)
        return render(request, 'company/company_form.html', {'form': form})
    else:
        if id==0:
            form = CompanyForm(request.POST)
            if form.is_valid():
                form.save()
                messages.success(request, f'Company has been created.')
        else:
            company = Company.objects.get(pk=id)
            form = CompanyForm(request.POST, instance=company)
            if form.is_valid():
                form.save()
            messages.success(request, f'Company has been Updated.')
            #else:
                #messages.alert(request, f'Company has been not Updated.')
        return redirect('company-list')

Может я что то не так делаю. Нужна помощь на этом этапе.

1 Ответ

0 голосов
/ 30 апреля 2020

Вы используете побитовый оператор-и & в вашем чистом методе. Используйте and или измените свой if на следующее:

if 100000 <= self.cleaned_data['pin'] <= 999999:

Используя and:

if self.cleaned_data.get('pin') <= 999999 and self.cleaned_data.get('pin') >= 100000:

Редактировать:

Ах, похоже, что вы ' повторное сравнение строки с целыми числами. Попробуйте следующее.

def clean(self):
    pin = int(self.cleaned_data['pin'].strip())
    if not( 100000 <= pin <= 999999):
        raise ValidationError("Invalid number")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...