Pregunta

Tengo una forma que se parece a la siguiente (simplificado por razones de brevedad):

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

En un principio, a los efectos de degradación elegante, única precios es visible. Si el usuario ha habilitado javascript, escondo Precios y hacer pricing_type visible. Ahora, en un pricing_type Selección de radio, hago pricing_flat_cost o pricing_percent_off visible. Esto hace que para una interfaz de usuario más preciso y fácil de usar.

Mis preguntas: ¿Cómo debo ir sobre la codificación de la lógica que las cifras a dónde llevar los valores de la RegexField --- o los pricing_flat_price y pricing_percent_off campos? Debería quizá crear una función en ItemForm que se lo imagina y devuelve el valor correcto?

O tal vez hay un enfoque más limpio que alguien podría sugerir?

¿Fue útil?

Solución

Definir un widget personalizado para la selección del tipo e incluir el código JavaScript como un archivo .js separada .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top