Python 更改在Django中使用ModelForm创建的表单元素的宽度
如果使用ModelForm创建textarea表单元素,如何更改其宽度 以下是我的产品类别:Python 更改在Django中使用ModelForm创建的表单元素的宽度,python,html,django,django-forms,django-templates,Python,Html,Django,Django Forms,Django Templates,如果使用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 for
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\u desc
字段示例(当表单没有自定义前缀时):
第二种方法是将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
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
是的
第三种方法是暂时离开newforms的声明式界面,并在自定义构造函数中设置小部件属性
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
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
字段对象没有“attrs”属性,但它们的小部件有。如果您正在使用大量使用样式的Grappelli之类的附加组件,您可能会发现由于CSS选择器作用于小部件,任何重写的行和列属性都会被忽略。当使用上面zuber出色的第二或第三种方法时,可能会发生这种情况 在这种情况下,只需通过设置“style”属性而不是“rows”和“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;'
在管理模型视图中设置行和css类:
'explicacion': AutosizedTextarea(attrs={'rows': 5, 'class': 'input-xxlarge', 'style': 'width: 99% !important; resize: vertical !important;'}),
这真的应该是一个编辑,而不是它自己的答案(与SO模型更好),但你没有足够的声誉进行编辑…我已经合并了编辑,我们可以保留这个答案,如果有人想投票了。对不起,你是对的-我应该留下一个评论代替。下次我会做得更好:)选项3非常有用。也许这个例子还可以显示,这些字段不需要在表单中定义,但仍然可以覆盖模型中定义的字段,这些字段会自动通过。您还可以在admin.py中为ModelAdmin添加css类,我认为这样会更干净一些。有点失望的是Grappelli没有使用stock django admin提供的cols/行。有没有办法用一行代码对表单中的所有字段应用特定的
宽度
,而不是一个接一个地显式应用?我可以用这种方法自定义django登录表单的默认外观