Django:自定义特定表单字段的HTML

时间:2011-10-06 09:03:15

标签: django django-forms

 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字段前添加一个文本变量。

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

更新

因此,我的表单中的每个字段都在我的模板中由{{ 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来实现这个问题。希望这能更好地解释它!

1 个答案:

答案 0 :(得分:18)

您可以创建继承自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)
    # ...

希望这有帮助。