2011-10-06 44 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