Обработка изящной деградации в форме Джанго - PullRequest
2 голосов
/ 12 октября 2010

У меня есть форма, которая выглядит примерно так (упрощенно для краткости):

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_flat_cost или pricing_percent_off видимым.Это делает для более точного и удобного пользовательского интерфейса.

Мои вопросы: Как мне пойти о кодировании логики, которая выясняет, где взять значения из - RegexField или pricing_flat_price *Поля 1019 * и pricing_percent_off ?Должен ли я, возможно, создать функцию в ItemForm , которая вычисляет ее и возвращает правильное значение?

Или, возможно, есть более чистый подход, который кто-то может предложить?

1 Ответ

1 голос
/ 12 октября 2010

Определите пользовательский виджет для выбора типа и включите код JavaScript в отдельный файл .js .

...