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

sup*_*er9 9 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',
                   )
Run Code Online (Sandbox Code Playgroud)

我需要在cost_price字段前面包含一个文本变量.

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

UPDATE

因此,我的表单中的每个字段都{{ field }}在我的模板中表示.这{{ field }}将为该特定字段生成HTML.我想修改cost_price字段的HTML,以便我可以将变量附加{{ currency_type }}到HTML的前面.所以看起来应该是这样的:

<span>USD</span><input type="text" name="cost_price" id="id_cost_price">
Run Code Online (Sandbox Code Playgroud)

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

Mis*_*hor 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)
    # ...
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.