zoukankan      html  css  js  c++  java
  • Django ModelForm修改默认的控件属性

    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})
    
    
  • 相关阅读:
    微信小程序之页面路由(九)
    Laravel生成Word文档
    ubuntu配置虚拟主机
    在eclipse中加入API文档帮助
    蓝桥杯java 基础练习 芯片测试
    Linux解压缩文件
    数据库范式(转)
    蓝桥杯java 基础练习 龟兔赛跑预测
    蓝桥杯java 算法提高 邮票面值设计
    蓝桥杯java 算法提高 统计单词数
  • 原文地址:https://www.cnblogs.com/haoxi/p/6684974.html
Copyright © 2011-2022 走看看