我有一个类似于以下内容的表单(为简洁起见而简化):
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,我会隐藏定价并显示 pricing_type 。现在,在 pricing_type 广播选择中,我可以看到 pricing_flat_cost 或 pricing_percent_off 。这使得用户界面更加精确和用户友好。
我的问题:我应该如何编写逻辑来计算从RegexField或 pricing_flat_price 和 pricing_percent_off 字段中获取值的位置?我是否应该在 ItemForm 中创建一个能够计算出来并返回正确值的函数?
或许有人建议采用更清洁的做法?