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