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})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM