表单

POST

POST 方法。

POST 方法,在这个方法中浏览器组合表单数据、对它们进行编码以用于传输、将它们发送到服务器然后接收它的响应。

https://docs.djangoproject.com/search/?q=forms&release=1 形式的URL。

POST 用于不同的目的。

GET 只应该用于不会影响系统状态的请求。

CSRF 保护

GET 请求的URL 可以很容易地作为书签、分享和重新提交。

form

考虑一下Django 的Admin 站点,不同类型的大量数据项需要在一个表单中准备好、渲染成HTML、使用一个方便的界面编辑、返回给服务器、验证并清除,然后保存或者向后继续处理。

Django 的表单功能可以简化并自动化大部分这些工作,而且还可以比大部分程序员自己所编写的代码更安全。

Django form的作用:

  • 为数据创建HTML 表单
  • 用来做用户提交的验证

可以手工编写代码来实现,但是Django 可以帮你完成所有这些工作。

假设我们定义一个注册用户的提交表单,我们想要获取提交的数据就需要一条条get,假设注册项过多,我们需要获取和验证数据有效性就会写很多判断和获取语句。。。。

from django.shortcuts import render

# Create your views here.

def user_list(request):
    username = request.POST.get('username')
    password = request.POST.get('password') 
mail
= request.POST.get('mail')
mobile
= request.POST.get('mobile') #验证: #输入不能为空,并且有的可以为空有的不可以为空
#如果email
= 111111 这样合法吗?
#如果mobile
= 1111 这样合法吗?
#如果sex
= 111111 这样合法吗?
... ''' 你在这里是不是需要做一大堆的输入验证啊?并且有很多这种页面会存在这种情况,如果每个函数都这样做估计就累死了 ''' return render(request,'user_list.html')

使用django构建表单:

views

def name_validate(value):
    #自定义验证方法(正则匹配
    name_re = re.compile(r'^[a-zA-Z]{1}\w+$')
    if not name_re.match(value):
        raise ValidationError('姓名格式错误')

def sex_vaildate(value):
    li = [1,2]
    if value not in li:
        raise ValidationError('请选择性别')

def mobile_validate(value):
    mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') #正则匹配
    if not mobile_re.match(str(value)):
        raise ValidationError('手机号码格式错误') # 如果没有匹配到主动触发一个错误
class Author(forms.Form):
#添加select标签
  GENDER_CHOICE =
  (('0', '-----'),
  ('1', '男'),
  ('2', '女'),
  )

#http://python.usyiyi.cn/django/ref/forms/fields.html

                
  name = forms.CharField(max_length=32,
error_messages={'required': u'姓名不能为空', # required 默认不能为空 设置False可以为空                 'max_length': u'不能超过32位字符'}, validators=[name_validate,], # validators 自定义验证方法 #widget 负责渲染网页上HTML 表单的输入元素和提取提交的原始数据。但是,Widget 需要赋值给表单字段。 widget=forms.widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'用户名'})) # attr为标签设置样式 # widgets默认为TextInput 更多请参考:http://python.usyiyi.cn/django/ref/forms/widgets.html
mobiles = forms.IntegerField(error_messages={'required': u'手机号不能为空'}, validators=[mobile_validate, ],
          widget=forms.widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'手机号'})) email = forms.EmailField(required=False,
error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
          widget=forms.widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'})) gender = forms.IntegerField(error_messages={'required': u'性别不能为空'}, widget=forms.widgets.Select(choices=GENDER_CHOICE,), # 设置Select属性 定义choices字段 接收 GENDER_CHOICE 定义的value值 validators=[sex_vaildate,])
def addAuthor(request):
    obj = Author() #实例化类
    if request.method == "POST":  #接收用户的post请求
        user_input_obj = Author(request.POST) 
        #request.POST包含咱们提交过来的数据,把它当做参数,实例化Author类,它会自动提交接收到的数据;实例化后的obj对象将会包含Author类中定义的字段.
     form的实例具有一个is_valid()方法,它为所有的字段运行验证的程序。当调用这个方法时,如果所有的字段都包含合法的数据,它将返回True; 将表单的数据放到cleaned_data 属性中。
        if user_input_obj.is_valid(): 
            data = user_input_obj.clean()   #obj.clean() 获取通过验证的数据
            new_author = models.Author(**data) #添加数据
            new_author.save() #保存
        else:
            error_msg = user_input_obj.errors #obj.errors 可以拿到用户提交数据出现的异常
            return render(request, "app01/addAuthor.html", {"obj":user_input_obj,"error":error_msg }) 返回obj对象 和 错误信息
    return render(request, "app01/addAuthor.html",{"obj": obj})  #返回obj

这是我们在第一次访问该URL 时预期发生的情况。

果表单的提交使用POST 请求,那么视图将再次创建一个表单实例并使用请求中的数据填充它:user_input_obj = Author(request.POST)这叫做”绑定数据至表单“(它现在是一个绑定的表单)。

然后可以根据要求编辑并改正它。

cleaned_data 属性或 clean() 中找到所有合法的表单数据。

在发送HTTP 重定向给浏览器告诉它下一步的去向之前,我们可以用这个数据来更新数据库或者做其它处理。

templates

{% block tables %}
    <div class="container">
        <div class="mains">
            <h1>Add Author</h1>
            <form action="/index/author/add/" method="POST">
              <div class="form-group">
                <label for="id_name">name</label>
                {{ obj.name }} <span>{{ error.name }}</span>
              </div>
              <div class="form-group">
                <label for="id_mobiles">mobiles</label>
                {{ obj.mobiles }} <span>{{ error.mobiles }}</span>
              </div>
              <div class="form-group">
                <label for="id_email">email</label>
                {{ obj.email }}<span>{{ error.email }}</span>
              </div>
              <div class="form-group">
                <label for="id_gender">gender</label>
                {{ obj.gender }}<span>{{ error.gender }}</span>
              </div>
              <button type="submit" class="btn btn-default">Submit</button>
            </form>
        </div>
    </div>
{% endblock %}
html

相关文章: