Выдает ошибку input поле django python
ввожу в поле input +79211234569 и выдает ошибку в html Выберите корректный вариант. Вашего варианта нет среди допустимых значений.
данные формы: <'form': <RelatedAddForm bound=True, valid=False, fields=(name;phone)>
request_post <QueryDict: {'csrfmiddlewaretoken': ['m9mKTv4kLWSFmW6Jj39OUAZ0zINBoFjvphjYADWvY97lk1oKAB3LAHhxOpmXnKbo'], 'cli ents-name': ['test'], 'clients-phone': ['+79121234566']}>
передает переменную name и переменную phone в правильном формате.
Скорее всего проблема в том, что проверка поля phone связана с ChoiceTxtField?
some_views
request_post = kwargs['request_post']
related_form = RelatedAddForm(request_post, prefix='clients')
forms
class ListTextWidget(forms.Select):
template_name = 'include/_forms_clients_datalist.html'
def format_value(self, value):
# Copied from forms.Input - makes sure value is rendered properly
if value == '' or value is None:
print('ListTextWidget None')
return ''
if self.is_localized:
print('ListTextWidget local')
return formats.localize_input(value)
return str(value)
class ChoiceTxtField(forms.ModelChoiceField):
widget=ListTextWidget()
class RelatedAddForm(forms.ModelForm):
phone = ChoiceTxtField(queryset=Clients.objects.order_by('-phone'))
class Meta:
model = Clients
fields = ['name', 'phone']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control', 'autocomplete': 'off'}),
}
models
class Clients(models.Model):
name = models.CharField(max_length=150, blank=True, verbose_name='Имя')
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
phone = models.CharField(validators=[phone_regex], unique=True, max_length=17, verbose_name='Телефон')
def get_absolute_url(self):
return reverse('view_clients', kwargs={'pk': self.pk})
def __str__(self):
return self.phone
Ответы (1 шт):
ModelChoiceField предполагает выбор только заранее сохраненной модели (указывается в параметре queryset). Наследовать ModelChoiceField не надо, изменения вносятся на уровне виджета. Поэтому надо заменить его на CharField.
class ListTextWidget(forms.Select):
template_name = 'include/_forms_clients_datalist.html'
class PhoneInputField(forms.CharField):
widget=ListTextWidget()
class RelatedAddForm(forms.ModelForm):
phone = PhoneInputField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['phone'].choices = Clients.objects.order_by('-phone').values_list('phone')
class Meta:
model = Clients
fields = ['name', 'phone']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control', 'autocomplete': 'off'}),
}