Django форма говорит, что поле является обязательным, несмотря на предоставление значения - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть форма с обязательным полем customer_phone_number, и, несмотря на передачу номера телефона с данными, форма недействительна.

Отправка формы через представление работает, но не в оболочке .

class OrderForm(forms.ModelForm):
    class Meta:
        model = models.Order
        fields = (
            'date',
            'customer_phone_number',
        )
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['customer_phone_number'].required = True
        self.fields['customer_phone_number'].widget = PhoneNumberPrefixWidget()

data = {
    'date': '2020-04-20',
    'customer_phone_number': '+17168567800',
}
form = OrderForm(data=data)
form.is_valid()
print(form.errors)  # {'customer_phone_number': ['This field is required.']}

Единственное, о чем я могу думать, это то, что я использую собственный виджет, но не знаю, как исправить эту ошибку.

from phonenumber_field.phonenumber import PhoneNumber

from django.forms import Select, TextInput
from django.forms.widgets import MultiWidget


class PhonePrefixSelect(Select):
    initial = '+1'

    def __init__(self, attrs=None):
        choices = [('+1', '+1')]
        super().__init__(attrs, choices=sorted(choices, key=lambda item: item[1]))

    def render(self, name, value, *args, **kwargs):
        return super().render(
            name, value or self.initial, *args, **kwargs)


class PhoneNumberPrefixWidget(MultiWidget):
    """
    A Widget that splits phone number input into:
    - a country select box for phone prefix
    - an input for local phone number
    """

    def __init__(self, attrs=None):
        widgets = (
            PhonePrefixSelect(attrs={
                'class': 'form-control w-25 mr-2',
                'tabindex': '-1'
            }),
            TextInput(attrs={
                'class': 'form-control w-75'
            }),
        )
        super().__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            if type(value) == PhoneNumber:
                if value.country_code and value.national_number:
                    return ["+%d" % value.country_code, value.national_number]
            else:
                return value.split('.')
        return [None, ""]

    def value_from_datadict(self, data, files, name):
        values = super().value_from_datadict(
            data, files, name)
        if all(values):
            return '%s.%s' % tuple(values)
        return ''

1 Ответ

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

Решается путем разделения customer_phone_number на два поля: customer_phone_number_0 и customer_phone_number_1

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