更改使用Django中的ModelForm创build的表单元素的宽度

如何使用ModelForm创build它,如何更改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; } 

第二种方法是将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文档中有描述 。

第三种方法是将newforms的声明性接口保留一段时间,并在自定义构造函数中设置你的widget属性。

 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很好的回答,但我相信在第三种方法的示例代码中有一个错误。 构造函数应该是:

 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这样大量使用样式的附加组件,您可能会发现任何被覆盖的行和列属性会因为select器作用于您的组件而被忽略。 当使用zuber出色的第二种或第三种方法时,可能会发生这种情况。

在这种情况下,只需使用第一种方法与第二种或第三种方法混合,通过设置“样式”属性而不是“行”和“cols”属性。

下面是上面第三种方法修改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;'