Django--表单视图

有了解或者做过web开发的应该都对表单不陌生,就是HTML中的form,对form的处理流程相信大家也有数,这里就不再多说。

 

表单视图是偏向于与用户直接交互的,

首先在一个工程中的app中建立一个forms.py,

#定义表单类
from django.forms import ModelForm
from app.models import Moment

class MomentForm(ModelForm):
    class Meta:
        model=Moment
        fields='__all__'

'''第一行引入的是django中表单类的基类ModelForm,
    第二行引入的是本app(app的名字叫app)models.py文件中的Moment类
    在表单类MomentForm中定义子类Meta,在Meta中声明与本表单关联的模型类及其字段
    fields可以是'__all__',也可以是相应模型类的某些字段如:
    fields=('content','username','kind')
'''

当然这是非常的简单的表单,实际中我们可以想到一些其他功能的表单怎么做呢,比如有下拉框的:

#引入这个一定要在第一行引入
from __future__ import unicode_literals
from django.db import models


Kind_Choices=(
    ('1','Python教程'),
    ('2','HTML教程'),
    ('3','Django教程'),
    ('4','个人心情'),#最后一逗号别忘了
)

class Moment(models.Model):
    content=models.CharField(max_length=100)
    username=models.CharField(max_length=20,default='匿名')
    kind=models.CharField(max_length=20,choices=Kind_Choices,default=Kind_Choices[0])

"""
    很明显的,如果我们想要让表单显示的是下拉框,我们需要改动的是models.py文件的内容而不是
    在froms.py中进行改动,然后我们进行这样改动之后,显示给用户的页面中kind输入框就会变成下拉框
    的形式      
"""
'''
    我们来捋捋思路啊,首先我们这个表单是需要依附在某个(某几个有关系的models)的数据之上的,
    比如我们要录入成绩,我们需要在一个表单上对好几个models类的某几个字段进行编辑然后再插入
    (我们成绩肯定有对应的哪一科,对应的哪个人吧,这些在关系数据库中都有相应的关系),然后
    确定需求之后我们就要对相对应的models类进行修改,这些models类后面都会映射到数据库中
    数据表中,我们定义的Kind_Choices是不是有点类似那个字段的取值范围
'''

既然已经定义了表单了,模型类也进行了修改(这时候你得先用makemigrations和migrate将修改同步一下),怎么在模板中用上这个表单呢(这里的表单就是动态的内容,而不是写死在模板中的)?



    
        录入界面
    
    
        
请输入并且提交 {{form.as_p}}

在模板中也写好了,那vies中肯定也不能落下啊,不然怎么回应用户的请求啊:

import os
from app.forms import MomentForm
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render

def moments_input(request):
    if request.method=='POST':
        form=MomentForm(request.POST)
        if form.is_valid():
            moment=form.save()
            moment.save()
            return HttpResponseRedirect(reverse('first-url')
    else:
        form=MomentForm()
    PROJECT_ROOT=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    return render(request,os.path.join(PROJECT_ROOT,'app/templates','moments_input.html'),
    {'form':form})

'''
    解释一下流程,我们请求大多是POST或者GET,如果用的是post就说明是提交了数据到后台来,我们
    先把request.POST这次请求的对象进行转换成MomentForm然后赋给form,对form的值进行合法性检验,
    然后将这次提交到后台来的数据保存,然后重定向到urls.py文件中名字为first-url的页面,
    如果不是提交数据,则返回表单,(注意传到前端的数据要用字典进行封装)。
'''
        

 

你可能感兴趣的:(Django学习)