06 使用POST方法实现Django的表单

1、概述

网页中的表单的作用是收集网页标签中的内容,<form>...</form> 中间可以由访问者添加类似于文本,选择,或者一些控制模块等等,然后这些内容将会被送到服务。不同类型的大量数据项需要在一个表单中准备好、渲染成HTML。使用一个方便的界面编辑、返回给服务器、验证并清除,然后保存或者向后继续处。本篇主要介绍怎样使用Django自带的表单:实现在一篇文章中用表单添加评论的功能。

2、在models.py层中添加数据库评论信息数据

class Comment(models.Model):
    name = models.CharField(null=True, blank=True, max_length=50)
    comment = models.TextField()
    def __str__(self):
        return self.name
解析:

a、通过在models.py层添加类Comment,映射到数据库中;

b、Comment中包含两个字段:name(评论人姓名)和comment(评论的内容)。

3、实现Django表单的步骤

1)渲染表单(将表单变成HTML结构)

 

from django import forms

class CommentForm(forms.Form):
    name = forms.CharField(max_length=50)
    comment = forms.CharField()
class detail(request):
    context = {}
    form = CommentForm()
    context['form'] = form 

解析:

a、在view.py中引入django的表单(实际操作是创建python文件,创建表单的内容),这边只是为了演示;

b、文件开头引入django表单的类 forms;

c、与数据库数据创建类似,创建表单类CommentForm,不同的是表单类的字段会映射到HTML 的<input>表单元素;

d、表单类CommentForm创建了两个字段,对应于文章评论的类Comment。目的是表单内容提交时与数据库相关联;

e、在detail视图中运用上下文结构,与模板关联,其中部分模板如下,通过模板标签的方式:

<form class="ui form" method="post">
  {{ form.as_p }}
  {% csrf_token %}
  <button type="submit" class="ui blue button" >Click</button>
</form>

f、渲染后表单部分网页显示如下:

2)绑定表单(用Post方法向表单提交评论时,表单会与数据进行校验)

因访问视图既有GET和POST两种方法,因此先做分离处理:

def detail(request):
    context = {}
    comment_list = Comment.objects.all()
    context['comment_list'] = comment_list

    if request.method == 'GET':
        form = CommentForm
    if request.method == 'POST':
        form = CommentForm(request.POST)
        print(form)
        print(form.errors)

 解析: 

a、若request是GET方法,则渲染表单;

b、若request是POST方法,则绑定表单,使用requset.POST将提交数据写入表单CommentForm中的cleaned_data中;

c、通过打印的方式可以知道:①该表单中包含的数据,包括label和input;②如果表单中数据输入为空,则表单会自动验证,输出默认错误信息;

3)数据校验和存储(告诉用户输入结果是否正确)

通过is_valid()方法判断表单数据是否正确,如果正确则通过取出cleaned_data中的数据,存入数据库:

if request.method == 'POST':
    form = CommentForm(request.POST)
    print(form)
    print(form.errors)
    if form.is_valid():
        name = form.cleaned_data['name']
        comment = form.cleaned_data['comment']
        c = Comment(name=name, comment=comment)
        c.save()
        return redirect(to='detail')
注意:通过redirect()方法返回到跳转的视图detail,detail是在URL中定义的。

4)定制表单的验证逻辑

默认表单的验证方式可以确定表单中的内容是否为空,而可以通过表单的验证逻辑添加用户的自定义验证或表单样式修改:

from django import forms
from django.core.exceptions import ValidationError

def words_validator(comment):
    if len(comment) < 4:
        raise ValidationError("Not enough words!")

def comment_validator(comment):
    if 'a' in comment:
        raise ValidationError("include the invalid word a")

class CommentForm(forms.Form):
    name = forms.CharField(max_length=50)
    comment = forms.CharField(
        widget=forms.Textarea(attrs={'class':'abc'}),
        error_messages={'required':'wow, not such word'},
        validators=[words_validator, comment_validator]
    )
解析:

a、comment字段中包含表单的三种通用属性,即widget,error_messages和validators;

b、通过widget=forms.Textarea可以修改默认表单内容input转换为textarea,使评论内容数据框变大;

c、error_messages通过字典的方式,修改默认无内容输入后的错误验证方式;

d、validators是验证器,接受列表的格式,列表中是定义的验证函数名,如上分别是评论内容字符数和非法字符。

e、在表单进行非法输入后:

5)手动渲染表单(按semantic ui的前端样式结构进行修改)

<form class="ui error form" method="post">
  {% if form.errors  %}
      <div class="ui error message">
        {{ form.errors }}
      </div>
      {% for field in form  %}
          <div class="{{ field.errors|yesno:'error, '}} field">
            {{ field.label }}
            {{ field }}
          </div>
      {% endfor %}
  {% else %}
      {% for field in form  %}
          <div class="field">
            {{ field.label }}
            {{ field }}
          </div>
      {% endfor %}
  {% endif %}
  {% csrf_token %}
  <button type="submit" class="ui blue button" >Click</button>
</form>
解析:

a、通过form.errors判断是否需要输出验证错误信息;

b、通过ui error message来添加错误信息;

c、一个field中包含一个label和相应的内容,通过模板过滤器yesno来添加field标签;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值