关于django model form

来源:互联网 发布:php删除符号 编辑:程序博客网 时间:2024/05/16 12:57

modelform从model自动导出form,基本使用如下:

class XXXForm(forms.ModelForm):
    class Meta:
        model = Your Model          # 指定从那个model导出

        # fields=("field1", "field2")        #可以限制只导出哪部分字段

          
1.重载初始化方法

def __init__(self, *args, **kwargs):    super(XXXForm, self).__init__(*args, **kwargs)    #do some other thing, 比如设置某个字段的值,或者HTML样式,也可以动态添加一个字段或者删除一个字段    self.fields['example'].widget.attrs['hidden'] = True 

2.widgets属性

 很多时候 django默认输出的 HTML 标签类型,不是我们想要的。 比如“多对多”,django默认输出一个 支持多选的下拉框  <select>,那样用户体验不好,需要按住ctrl键多选。

习惯上多选用复选框<checkbox>。

在init方法之中 是不能改变 super一句中已经生成的字段的html类型,只能改变值和样式。此时应该在 Meta元类中添加widgets配置。

class XXXForm(forms.ModelForm):
    class Meta:
            model = Your Model          # 指定从那个model导出

           widgets = {

                  "fieldname": forms.TextInput(attrs={"style": "width:180px;", "maxlength": 5, }),  #直接设置style或者某项属性改变样式,记得字典格式,赋值给attrs

          }

当然,也可以待表单初始化完成后,在设置html样式,比如

form = XXXForm(可能的参数,如instance,initial......)

form.fields["url"].widget.attrs = {"disable": "true", "readonly": "true"}#让这个字段在浏览器页面不可编辑


3.直接定义字段

有时候配置widgets仍然很麻烦,比如需要配置的field较多,每个又很长,则直接定义该字段。

class XXXForm(forms.ModelForm):

     fieldname = forms.Field类型(label=u“标签",..........该类型的参数)
     class Meta:
            model = Your Model          # 指定从那个model导出

需要注意,如果该fieldname与model中某个字段名相同,则用户定义类型样式覆盖django默认。很适合覆盖django诸如多选下拉框这种不友好的类型。

如果该fieldname不在model字段中,则会新增加一个字段,效果与在init方法中动态加字段一样。但是时机更早,此种方式,在super一句中已经生成该字段,

init方法中动态添加是在super之后。


更多资料 https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets

官网中很多技巧 ,诸如 改变字段顺序,formfactory, 改变queryet(仅外键和多对多才有的参数),以及initial参数等都可以通过第三种方式实现,更直观。但是如果初始化过程中对于字段的初始化时机有要求,以上技巧还是按照官网推荐的方法做。

原创粉丝点击