2011-10-06 2 views
9
class ItemForm(forms.ModelForm): 
    description = forms.CharField(label='Description', max_length=250, widget=forms.Textarea, required=False) 
    image = forms.ImageField(label='Item Picture', max_length=50, required=False) 
    start = forms.DateField(widget=SelectDateWidget, required=False) 
    end = forms.DateField(widget=SelectDateWidget, required=False) 
    cost_price = forms.CharField(label='Cost Price Per Unit', widget=???, max_length=5) 

    class Meta: 
     model = Item 
     fields = ('image', 
        'name', 
        'description', 
        'quantity', 
        'start', 
        'end', 
        'cost_price', 
        'selling_price', 
        ) 

Devo includere una variabile di testo davanti al campo cost_price.Django: Personalizzazione di un particolare campo HTML del campo

Dai documenti, so che la classe widget è ciò che ho bisogno di modificare ma non sono troppo sicuro su come fare per farlo.

UPDATE

Così ogni campo nella mia forma è rappresentata da {{ field }} nel mio modello. Questo {{ field }} genera l'HTML per quel particolare campo. Vorrei modificare l'HTML del campo cost_price in modo tale che possa aggiungere una variabile {{ currency_type }} nella parte anteriore dell'HTML. Così dovrebbe essere simile a questa:

<span>USD</span><input type="text" name="cost_price" id="id_cost_price"> 

In questo momento sto compreso questo {{ currency_type }} variabile attraverso la logica del modello. Mi stavo chiedendo se potevo farlo attraverso la personalizzazione del codice HTML del campo modulo, quindi la domanda. Spero che questo lo spieghi meglio!

+0

Non capisco completamente il problema. Puoi fornire un paio di esempi? –

+0

Se vuoi qualche istruzione o spiegazione per il campo, usa [help_text] (https://docs.djangoproject.com/en/dev/ref/forms/fields/#help-text). – DrTyrsa

+0

Ci scusiamo per cattive spiegazioni, l'ho aggiornato. Spero sia più chiaro! – super9

risposta

16

È possibile creare un widget modulo personalizzato che eredita dal widget TextInput (utilizzato per CharField) e sovrascrive il metodo di rendering. In questo modo puoi fare esattamente ciò che vuoi: inserire HTML personalizzato prima del normale HTML di TextInput widget.

from django.utils.safestring import mark_safe 
from django.forms import widgets 

# ... 

# your custom widget class 
class CostPriceWidget(widgets.TextInput): 
    def render(self, name, value, attrs=None): 
     return mark_safe(u'''<span>USD</span>%s''' % (super(CostPriceWidget, self).render(name, value, attrs))) 

# your form class 
class ItemForm(forms.ModelForm): 
    # ... 
    cost_price = forms.CharField(label='Cost Price Per Unit', widget=CostPriceWidget, max_length=5) 
    # ... 

Spero che questo aiuti.

+0

Fa ma il tipo di valuta è una variabile. Quindi non posso hardcode in questo modo. – super9

+0

Scusa, non devo leggere abbastanza bene la tua domanda. Quindi credo che sia necessario creare una sottoclasse di forms.CharField in modo che non passi un valore stringa del campo, ma un oggetto che definirà anche il tipo di valuta. Cercherò di modificare la mia risposta con la soluzione esatta se posso. – MisterMetaphor

+0

molto apprezzato! – super9