Manipulation dégradation progressive au sein d'une forme Django
-
29-09-2019 - |
Question
J'ai une forme qui ressemble à ce qui suit (simplifié par souci de concision):
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;'})
)
Dans un premier temps, dans le but de la dégradation gracieuse, seulement prix est visible. Si l'utilisateur a activé le javascript, je cache le prix et faire pricing_type visible. Maintenant, sur une pricing_type Sélection radio, je fais pricing_flat_cost ou pricing_percent_off visible. Cela rend pour une interface plus précise et conviviale.
Mes questions: Comment dois-je aller sur le codage de la logique que les chiffres où prendre les valeurs de l'--- RegexField ou pricing_flat_price et pricing_percent_off les champs? Je devrais peut-être créer une fonction ItemForm que les chiffres dehors et renvoie la valeur correcte?
Ou peut-être il y a une approche plus propre que quelqu'un pourrait suggérer?
La solution
Définir un widget personnalisé pour la sélection du type et inclure le code JavaScript dans un fichier .js séparé .