Frage

Ich habe ein Formular, das aussieht ähnlich der folgenden (der Kürze halber vereinfacht):

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;'})
    )

Zunächst zum Zweck der Graceful Degradation, nur Preis ist sichtbar. Wenn der Benutzer Javascript aktiviert, ich verbergen Preis und make pricing_type sichtbar. Nun, auf einem pricing_type Radio Auswahl, ich mache entweder pricing_flat_cost oder pricing_percent_off sichtbar. Dies sorgt für eine präzisere und benutzerfreundliche Benutzeroberfläche.

Meine Fragen: Wie soll ich mich über die Codierung der Logik, dass die Zahlen, wo die Werte von nehmen --- die RegexField oder die pricing_flat_price und pricing_percent_off Felder? Soll ich vielleicht eine Funktion in erstellen ItemForm , dass die Zahlen es aus und gibt den richtigen Wert?

Oder vielleicht gibt es einen sauberen Ansatz, dass jemand vorschlagen könnte?

War es hilfreich?

Lösung

Definieren eines benutzerdefinierten Widget für die Typenauswahl und umfassen den JavaScript-Code als separate JS-Datei .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top