Обработка изящной деградации в форме Джанго
-
29-09-2019 - |
Вопрос
У меня есть форма, похожая на следующее (упрощено для краткости):
PRICING_PATTERN = r'(?:^\$?(?P<flat_price>\d+|\d?\.\d\d)$)|(?:^(?P<percent_off>\d+)\s*\%\s*off$)'
class ItemForm(forms.Form):
pricing = forms.RegexField(
label='Pricing',
regex=PRICING_PATTERN
)
pricing_type = forms.CharField(
label='Deal type',
widget=forms.RadioSelect(
choices=(
('flat_price','Flat price'),
('percent_off','Percentage off'),
),
attrs={'style': 'display: none;'})
),
)
pricing_flat_price = forms.DecimalField(
label='Flat price',
max_digits=5,
decimal_places=2,
widget=forms.TextInput(attrs={'style': 'display: none;'})
)
pricing_percent_off = forms.IntegerField(
label='Percent off',
required=False,
min_value=0,
max_value=100,
widget=forms.TextInput(attrs={'style': 'display: none;'})
)
Изначально, с целью изящной деградации, только ценообразование виден. Если пользователь включен JavaScript, я прячу ценообразование и сделать цена_тип Видимый. Теперь на цена_тип Радиовыборка, я делаю либо цена_fLAT_COST или цена_Перцент_ффа Видимый. Это делает для более точного и удобного пользовательского интерфейса.
Мои вопросы: как мне пойти на кодирование логики, которая выясняет, где взять значения из-regexfield или ценой_флат_Прис и цена_Перцент_ффа поля? Должен ли я создать функцию в Itemform Это дает это и возвращает правильное значение?
Или, может быть, есть более чистый подход, который кто -то может предложить?
Решение
Определите пользовательский виджет для выбора типа и включите код JavaScript как отдельный файл .js.