Django 修改默认ModelForm的控件属性

Django IT敢客 4个月前 (04-27) 7329次浏览 已收录 0个评论 扫描二维码

django-form 有个参数叫 widgets,通过这个参数,可以给 form 相应的字段添加一下 html 属性,使用 css 样式可以如下:

class CommentForm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
    name = forms.TextInput(attrs={'size': 10, 'title': 'Your name',})
    url = forms.URLField()
    comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))
>>> f = CommentForm(auto_id=False)
>>> f.as_table()

<tr>
<th>Name:</th>
<td><input type="text" name="name" class="special"/></td>
</tr>
<tr>
<th>Url:</th>
<td><input type="url" name="url"/></td>
</tr>
<tr>
<th>Comment:</th>
<td><input type="text" name="comment" size="40"/></td>
</tr>

Django 中利用 ModelForm 可以快速地利用数据库对应的 Model 子类来自动创建对应表单.

例如:

from django.db import models
from django.forms import ModelForm
class Book(models.Model):
    name = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ['name', 'authors']

但这样默认创建的表单是很丑的, 一般需要重写字段的控件属性, 来加入各种效果. 总结下我常用的两种.

修改 Meta 的 widgets 属性
在 Django 手册的 ModelForm 一章中, 提供了这种方式, Book 的 name 属性为 CharField 如果希望它表示成一个<textarea>而不是默认的<input type="text">时, 可以按如下方式覆盖字段默认的 Widget:

class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ['name', 'authors']
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

这种方式可以指定控件的类型及其对应的属性, 不过大部分时候, 默认的控件类型已经够用了, 只需要修改控件的属性. 可以采取另外一种更方便的方法.

重写init方法
通过通过重写init 方法, 遍历 base_fields 字段, 来快速修改控件的属性.

class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ['name', 'authors']
    def __init__(self, *args, **kwargs):
        super(BookForm, self).__init__(*args, **kwargs)
        for field_name in self.base_fields:
            field = self.base_fields[field_name]
            field.widget.attes.update({'cols': 80, 'rows': 20})

具体可参考https://docs.djangoproject.com/en/1.11/ref/forms/widgets/

 


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Django 修改默认 ModelForm 的控件属性
喜欢 (159)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址