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?

Était-ce utile?

La solution

Définir un widget personnalisé pour la sélection du type et inclure le code JavaScript dans un fichier .js séparé .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top