处理Django表单中的优雅降级

时间:2010-10-11 20:09:10

标签: python django-forms graceful-degradation

我有一个类似于以下内容的表单(为简洁起见而简化):

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 中创建一个能够计算出来并返回正确值的函数?

或许有人建议采用更清洁的做法?

1 个答案:

答案 0 :(得分:1)

为类型选择定义自定义窗口小部件,并包含JavaScript代码as a separate .js file