自定义Django字段的显示样式

Django表单字段是通过widget控制显示样式的 , 绝大多数字段默认继承自Field类 , Field类默认使用TextInput作为显示widget , 如:CharField ,具体实现可参考Django源代码:
class Field:widget = TextInput# Default widget to use when rendering this type of Field....def __init__(self, *, required=True, widget=None, label=None, initial=None,help_text='', error_messages=None, show_hidden_initial=False,validators=(), localize=False, disabled=False, label_suffix=None):...源代码位置:..\django\forms\fields.py
另外一些字段则使用特定的widget ,如IntegerField:
class IntegerField(Field):widget = NumberInputdefault_error_messages = {'invalid': _('Enter a whole number.'),}re_decimal = re.compile(r'\.0*\s*$')...某些情况下Django默认的显示样式并不符合我们的需求 , 如Textarea字段 , 它会显示一个10行40列的文本域 , 这个使用起来不够方便 , 经常需要左右拖动滚动条 。
下面以修改Textarea的显示样式为例介绍如何自定义字段显示样式 。
首先查看Textarea Widget的代码逻辑 , 源代码路径..\site-packages\django\forms\widgets.py:
class Textarea(Widget):template_name = 'django/forms/widgets/textarea.html'def __init__(self, attrs=None):# Use slightly better defaults than HTML's 20x2 boxdefault_attrs = {'cols': '40', 'rows': '10'}if attrs:default_attrs.update(attrs)super().__init__(default_attrs)可见Textarea在Django中默认显示10行40列 , 同时可以通过实例化Textarea时传递attrs属性的方式更新它的显示样式 。
如果直接修改Django源代码也能实现更新Textarea显示样式的 , 只要你不怕技术老大打你就这么干 。
看到这里最先想到的就是使用下面的方式更新attrs:
body = forms.Textarea(attrs={'cols': '100', 'rows': '10'})执行代码 , 发现文本域的显示样式并没有变化 , 断点调试 , 发现form实例的body字段所使用的widget仍然是原始的Textarea:
自定义Django字段的显示样式文章插图
这就意味着我们不能直接修改widget, 那么尝试重新指定widget的方式呢 , 代码如下:
【自定义Django字段的显示样式】body = forms.CharField(label=u'请求体', widget=forms.Textarea(attrs={'cols': '100', 'rows': '10'}))重新启动网站 , 发现文本域已经按照我们希望的样式显示了:
自定义Django字段的显示样式文章插图
那么能不能进一步调整呢?我们试试下面代码:
rugbody = forms.CharField(label=u'请求体', widget=forms.Textarea(attrs={'cols': '100', 'rows': '10', 'style':"border: 2px solid red"}))重启网站 , 发现文本域的边框也变了:
自定义Django字段的显示样式文章插图
自定义Django字段的显示样式文章插图
到此结束!