2011-10-06 8 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 사용자 정의

문서에서 위젯 클래스를 수정해야하지만 그 작업을 수행하는 방법에 대해서는 확신 할 수 없다는 것을 알고 있습니다.

UPDATE는

그래서 내 양식의 각 필드는 내 템플릿에 {{ field }}으로 표시됩니다. 이 {{ field }}은 해당 필드에 대한 HTML을 생성합니다. 나는 변수 {{ currency_type }}을 HTML 앞부분에 추가 할 수 있도록 cost_price 필드의 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

CharField에 사용되는 TextInput 위젯을 상속 한 사용자 정의 양식 위젯을 만들 수 있으며 렌더링 메서드를 재정의합니다. 이렇게하면 원하는대로 정확하게 작업 할 수 있습니다. 일반 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

죄송합니다. 귀하의 질문을 충분히 읽지 않았어야합니다. 그렇다면 form.CharField를 하위 클래스화해야하므로 필드의 문자열 값이 아니라 통화 유형을 정의하는 객체를 전달할 것이라고 생각합니다. 할 수 있으면 정확한 해결책으로 내 대답을 편집하려고 노력할 것입니다. – MisterMetaphor

+0

많이 감사드립니다! – super9

관련 문제