ModelFormを使用して作成した場合、textareaフォーム要素の幅を変更するにはどうすればよいですか?
これが私の製品クラスです。
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
は実際のフォーム要素です...
ユースケースの最も簡単な方法は、CSSを使用することです。これは、プレゼンテーションを定義するための言語です。フォームによって生成されたコードを見て、興味のあるフィールドのIDを書き留め、CSSを介してこれらのフィールドの外観を変更します。
ProductFormのlong_desc
フィールドの例(フォームにカスタムプレフィックスがない場合):
#id_long_desc {
width: 300px;
height: 200px;
}
2番目のアプローチは、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
Django documentation で説明されています。
3番目のアプローチは、しばらくの間newformsのNice宣言インターフェースを離れ、カスタムコンストラクターでウィジェット属性を設定することです。
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
このアプローチには次の利点があります。
Zuberによる優れた答えですが、3番目のアプローチのコード例には誤りがあると思います。コンストラクタは次のようにする必要があります。
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」属性はありませんが、ウィジェットにはあります。
スタイルを多用するGrappelliのようなアドオンを使用している場合、CSSセレクターがウィジェットに作用するため、オーバーライドされたrowおよびcol属性が無視されることがあります。これは、上記のzuberの優れた2番目または3番目のアプローチを使用している場合に発生する可能性があります。
この場合、「行」属性と「列」属性の代わりに「スタイル」属性を設定することにより、第2アプローチまたは第3アプローチとブレンドした第1アプローチを使用します。
上記の第3のアプローチでinitを変更する例を次に示します。
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;'
管理モデルビューで行とcssクラスを設定します。
'explicacion': AutosizedTextarea(attrs={'rows': 5, 'class': 'input-xxlarge', 'style': 'width: 99% !important; resize: vertical !important;'}),