2008-09-21 50 views
47

用的ModelForm創建的表單元素的寬度如何更改一個textarea形式元素的寬度,如果我使用的ModelForm創建它嗎?更改在Django

這裏是我產品類:

class ProductForm(ModelForm): 
    long_desc = forms.CharField(widget=forms.Textarea) 
    short_desc = forms.CharField(widget=forms.Textarea) 
    class Meta: 
     model = Product 

和模板代碼...

{% for f in form %} 
    {{ f.name }}:{{ f }} 
{% endfor %} 

f是實際的表單元素...

回答

100

的最簡單的方法你用例是使用CSS。這是一種用於定義演示文稿的語言。看看通過形式生成的代碼,請注意id的字段的,你的興趣,並通過CSS改變這些字段的外觀。

例爲您ProductForm long_desc場(當你的形式不具有自定義前綴):

#id_long_desc { 
    width: 300px; 
    height: 200px; 
} 

第二條本辦法是將attrs關鍵字傳遞給你的窗口部件的構造。

class ProductForm(ModelForm): 
    long_desc = forms.CharField(widget=forms.Textarea(attrs={'cols': 10, 'rows': 20})) 
    short_desc = forms.CharField(widget=forms.Textarea) 
    class Meta: 
     model = Product 

這是described in Django documentation

第三種方法是讓newforms的聲明性接口保留一段時間,並在自定義構造函數中設置小部件屬性。

class ProductForm(ModelForm): 
    long_desc = forms.CharField(widget=forms.Textarea) 
    short_desc = forms.CharField(widget=forms.Textarea) 
    class Meta: 
     model = Product 

    # Edit by bryan 
    def __init__(self, *args, **kwargs): 
     super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor 
     self.fields['long_desc'].widget.attrs['cols'] = 10 
     self.fields['long_desc'].widget.attrs['rows'] = 20 

這種方法具有以下優點:

  • 您可以定義構件屬性對於那些從模型自動生成,而不重新定義整個字段的字段。
  • 它不依賴於你的表格的前綴。
+0

第二個工作完全 – 2008-09-21 07:15:09

+2

選項3非常有用。也許這個例子還可以顯示這些字段不需要在表單中定義,但仍然可以覆蓋自動通過模型定義的字段。 – 2009-12-03 16:20:50

15

zuber很好的回答,但我相信在第三種方法的示例代碼中存在錯誤。構造函數應該是:

def __init__(self, *args, **kwargs): 
    super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor 
    self.fields['long_desc'].widget.attrs['cols'] = 10 
    self.fields['long_desc'].widget.attrs['cols'] = 20 

Field對象沒有'attrs'屬性,但是它們的小部件具有。

+1

這真的應該是一個編輯,而不是它自己的答案(它與SO模型更好),但你沒有足夠的聲譽來編輯... – 2009-03-13 09:30:03

4

在您使用的附加像格拉佩利,使大量使用的風格時,你會發現,任何重寫ROW和COL屬性得到,因爲作用於你的widget CSS選擇忽略。當使用zuber出色的第二種或第三種方法時,可能會發生這種情況。

在這種情況下,只需使用與第二或通過設置「風格」第三混合方法第一種方法的屬性,而不是「行」和「COLS」屬性。

這裏有一個例子在上述第三種方法修改初始化

def __init__(self, *args, **kwargs): 
    super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor 
    self.fields['short_desc'].widget.attrs['style'] = 'width:400px; height:40px;' 
    self.fields['long_desc'].widget.attrs['style'] = 'width:800px; height:80px;' 
0

組行和在您的管理模型視圖你的CSS類:

'explicacion': AutosizedTextarea(attrs={'rows': 5, 'class': 'input-xxlarge', 'style': 'width: 99% !important; resize: vertical !important;'}),