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

我需要在cost_price字段前包含一个文本变量。Django:自定义特定的表单字段的HTML

从文档中,我知道widget类是我需要修改的,但我不太确定如何去做。

UPDATE

所以在我的每一个表单域是由我的模板{{ field }}表示。这{{ field }}生成该特定字段的HTML。我想修改cost_price字段的HTML,以便我可以将变量{{ currency_type }}附加到HTML的前面。因此,它应该是这个样子:

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

现在我包括通过模板逻辑这个{{ currency_type }}变量。我想知道是否可以通过自定义表单字段的HTML来实现这个问题。希望这解释得更好!

+0

我不完全明白这个问题。你能提供几个例子吗? –

+0

如果您想要某些领域的说明或解释,请使用[help_text](https://docs.djangoproject.com/en/dev/ref/forms/fields/#help-text)。 – DrTyrsa

+0

对不起,我已经更新了。我希望它更清楚! – super9

回答

16

您可以创建自定义表单控件,该控件继承自TextInput控件(用于CharField)并覆盖它的呈现方法。通过这种方式,您可以完全按照自己的意愿进行操作 - 在常规TextInput小部件HTML之前插入自定义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) 
    # ... 

希望这会有所帮助。

+0

但它的货币类型是一个变量。所以我不能像这样硬编码。 – super9

+0

对不起,我一定没有完全读完你的问题。然后我相信你需要继承forms.CharField,所以它不会传递字段的字符串值,而是一个也会定义货币类型的对象。如果可以的话,我会尝试用确切的解决方案编辑我的答案。 – MisterMetaphor

+0

非常感谢! – super9