Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改在Django中使用ModelForm创建的表单元素的宽度_Python_Html_Django_Django Forms_Django Templates - Fatal编程技术网

Python 更改在Django中使用ModelForm创建的表单元素的宽度

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

如果使用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\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登录表单的默认外观