Как проверить поле с django автозаполнением света - PullRequest
0 голосов
/ 31 января 2020

Я использую django autocomplete light, чтобы позволить пользователю либо искать существующий badge_id, либо создать новый значок с указанным badge_id.

Мои модели:

class User(models.Model):
    badge = models.ForeignKey(Badge, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=20, blank=True, null=True, verbose_name=_('first name'))
    last_name = models.CharField(max_length=20, blank=True, null=True, verbose_name=_('last name'))

class Badge(models.Model):
    badge_id = models.CharField(
        primary_key=True,
        max_length=6,
        validators=[
            RegexValidator(
                regex='^[0-9]{6}$',
                message="Badge id must be 6 digits.",
                code='nomatch'
            )
        ],
    )

Моя пользовательская форма:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = (
            'badge',
            'first_name',
            'last_name',
        )
        widgets = {
            'badge': autocomplete.ModelSelect2(
                url='badge-autocomplete',
                forward=["badge"],
            )
        }

Мой взгляд на dal:

class BadgeAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        if not self.request.user.is_authenticated:
            return Badge.objects.none()

        qs = Badge.objects.all()

        badge = self.forwarded.get('badge_id', None)

        if badge:
            qs = qs.filter(badge_id=badge)

        if self.q:
            qs = qs.filter(badge_id__istartswith=self.q)

        return qs

При этом проверка не работает, и это приводит к двум проблемам:

  • Я могу создать значки, содержащие менее 6 цифр (несмотря на мой валидатор модели)
  • При вводе более 6 цифр возникает сторона сервера DataError, но на внешнем интерфейсе ничего не отображается

Есть идеи, как это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...