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})
    
    
  • 相关阅读:
    [整理] jQuery插件开发
    windows2008r2安装笔记
    javascript 中 typeof 和 instanceof 的区别
    mysql 复制表结构和表数据
    一个例子明白 javascript 中 for 与 for in 的区别
    实现自己的框架
    Jenkins 前端项目构建报错:Vue packages version mismatch
    linux Auditd 审计工具安装报错
    linux定时压缩日志文件脚本
    Robot Framework 3.1.2 执行测试用例报错
  • 原文地址:https://www.cnblogs.com/haoxi/p/6684974.html
Copyright © 2011-2022 走看看