Django From表单定制

参考文档:

Forms

The Forms API

Working with forms

 

一、简单的Form表达定制

1)首先我们得定制Form表单类,下面我们创建一个简单的类:

class BookForm(forms.Form):
    bookname = forms.CharField(max_length=10)
    publish_date = forms.DateField()

2)在视图中引用:

def book(request):
    #Froms将会是一个html实例
    Froms = forms.BookForm()
    return render(request,"app01/book.html",{"bk":Froms})

3)我们再定制模板来接收Froms的值:

    <div class="container">
        <form class="form-horizontal" action="" method="post">

            {{ bk }}
        <input type="submit" value="commit">
        </form>
    </div>

这样当我们访问指定页面时,能看定制的Form表单:

按F12,再查看代码标签,这就是Froms实例化后的html代码:

 

二、forms表单属性设置:

class BookForm(forms.Form):
    publish_id_choice = {
        (0,u'a出版社'),
        (1,u'b出版社'),
    }
    publish_id = forms.IntegerField(widget=forms.widgets.Select(choices=publish_id_choice,attrs={'class':'form-contorl'}))
    bookname = forms.CharField(max_length=10,
                               min_length=5,
                               error_messages={
                                   'required':u'书名不能为空',
                                   'max_length':u'不能多余10个字',
                                   'min_length':u'不能少于5个字',
                               },
                               widget=forms.TextInput(attrs={'class':'form-contorl','palceholder':u'标题不少于5字'}))
    publish_date = forms.DateField()

如上,我们可以设置最大最小长度,错误消息,自定义select,设置html标签的class属性值,生成的html源代码如下:

 

三、ModelForm

根据model自动生成form表单:

def bookmodel(request):
    if request.method == 'GET':
        Form = forms.BookModelForm()
    elif request.method == 'POST':
        Form = forms.BookModelForm(request.POST)
        if Form.is_valid():
            form_data = Form.cleaned_data
            print(form_data)
            Form.save()
    return render(request,'app01/book.html',{"bk":Form})

生成的前端样式  , HTML 取表单数据{{ bk }} :

Form.save()方法能直接保存提交的数据到数据库。

其他方法去表单数据:

                {% for i in bk %}
                {{ i.label_tag}}
                {{ i }}
                {% endfor %}

                <hr>

                {% for i in bk %}
                {{ i.label}}
                {{ i }}
                {% endfor %}

                <hr>

                {% for i in bk %}
                {{ i.name}}
                {{ i }}
                {% endfor %}

# 前端生成的html源代码:

 

分别对应的前端样式,可以看到i.label_tag是取对应label的整个html值,i.label是取对应的label中的text值, i.name是取i的name的值,i.errors取出错误:

 

posted @ 2016-08-18 18:43  电神  阅读(1730)  评论(0编辑  收藏  举报