Django ModelForm覆盖小部件

时间:2012-03-26 19:31:18

标签: django django-models

免责声明:我是python和Django的初学者,但有Drupal编程经验。

如何覆盖此默认小部件:

#models.py
class Project(models.Model):
color_mode = models.CharField(max_length=50, null=True, blank=True, help_text='colors - e.g black and white, grayscale')

在我的表格中有一个选择框?以下是好的还是我错过了什么?

#forms.py
from django.forms import ModelForm, Select
class ProjectForm(ModelForm):
    class Meta:
        model = Project
        fields = ('title', 'date_created', 'path', 'color_mode')
        colors = (
                   ('mixed', 'Mixed (i.e. some color or grayscale, some black and white)'),
                   ('color_grayscale', 'Color / Grayscale'),
                   ('black_and_white', 'Black and White only'),
                   )
        widgets = {'color_mode': Select(choices=colors)}

在阅读https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets之后,由于该示例仅讨论TextArea而且我的小部件讨论似乎排除了ModelForm,因此我迷失了。

谢谢!

1 个答案:

答案 0 :(得分:81)

如果您想覆盖一般表单的窗口小部件,最好的方法是设置widgets类的ModelForm Meta属性:

  

要为字段指定自定义窗口小部件,请使用内部Meta类的窗口小部件属性。这应该是将字段名称映射到窗口小部件类或实例的字典。

     

例如,如果您希望Author的name属性的CharField由<textarea>代替其默认<input type="text">,则可以覆盖该字段的小部件:

from django.forms import ModelForm, Textarea
from myapp.models import Author

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }
     

小部件字典接受小部件实例(例如,Textarea(...))或类(例如,Textarea)。

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields