2011-10-06 35 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', 
        ) 

Necesito incluir una variable de texto delante del campo cost_price.Django: Personalizar un HTML de campo de formulario particular

De los documentos, sé que la clase de widgets es lo que necesito modificar, pero no estoy muy seguro de cómo hacerlo.

ACTUALIZACIÓN

Así cada campo en mi forma está representado por {{ field }} en mi plantilla. Este {{ field }} genera el HTML para ese campo en particular. Me gustaría modificar el HTML del campo cost_price para que pueda agregar una variable {{ currency_type }} al frente del HTML. Por lo que debe ser algo como esto:

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

En este momento estoy incluyendo esta variable {{ currency_type }} través de la lógica de la plantilla. Me preguntaba si podría hacer esto mediante la personalización del HTML del campo de formulario, de ahí la pregunta. Espero que esto lo explique mejor!

+0

No entiendo completamente el problema. ¿Puedes darnos un par de ejemplos? –

+0

Si desea alguna instrucción o explicación para el campo, use [help_text] (https://docs.djangoproject.com/en/dev/ref/forms/fields/#help-text). – DrTyrsa

+0

Lo siento por una mala explicación, la he actualizado. ¡Espero que esté más claro! – super9

Respuesta

16

Puede crear un widget de formulario personalizado que herede del widget TextInput (que se utiliza para CharField) y anula su método de representación. De esta forma, puede hacer exactamente lo que quiera: insertar HTML personalizado antes del widget regular de TextInput HTML.

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) 
    # ... 

Espero que esto ayude.

+0

Sí, pero el tipo de moneda es una variable. Entonces no puedo codificarlo así. – super9

+0

Lo siento, no debo haber leído su pregunta lo suficiente. Entonces creo que necesita subclasificar formularios.CharField para que no pase un valor de cadena de su campo, sino un objeto que también definirá el tipo de moneda. Trataré de editar mi respuesta con la solución exacta si puedo. – MisterMetaphor

+0

muy apreciado! – super9

Cuestiones relacionadas