学会用Django框架实现功能(三)

用 Post 方法实现 django 表单

Posted by shexiaobin on April 22, 2019

用 Post 方法实现 django 表单

使用django自带的表单系统,双向交互

1. Model层

# 评论模型
class Comment(models.Model):
    name = models.CharField(null=True, blank=True, max_length=200)
    comment = models.TextField()

    def __str__(self):
        return self.name

1.1 合并、运行数据库

python manage.py makemigrations
python manage.py migrate

1.2 admin.py

from get_app.models import Comment
admin.site.register(Comment)

2. 快速部署

2.1 view层

from get_app.models import Comment
def detail(request):
	comment_list = Comment.objects.all()
    context = {
        'comment_list':comment_list,
    }
    
return render(request,'detail.html',context)

2.2 urls.py

from get_app.views import detail
urlpatterns = [
    path('admin/', admin.site.urls),
    path('detail/', detail, name='detail'),
]

2.3 启动

3. 创建表单,并进行渲染

在你的app中创建一个form.py文件

from django import forms
from django.core.exceptions import ValidationError
class CommentForm(forms.Form):
    # , min_length = 2最小长度
    name = forms.CharField(max_length=50)
    # comment = forms.CharField()
    # 修改表单样式, 尽量不在后端修改,后端更加注重逻辑层面的东西
    comment = forms.CharField(
      	# 通过修改widget把前端页面输入框的样式变大
        widget=forms.Textarea(),
        # 定义错误提示
        error_messages={
            # 自带的错误验证方法,输入为空的错误提示
            'required': 'wow,such words'
        },

        # 自定义错误验证
        validators=[words_validators, 
                    comment_validators]

    )
# 错误内容
# comment文本内容,model层定义的
def words_validators(comment):
    if len(comment) < 4:
        raise ValidationError('Not enough words')

def comment_validators(comment):
    if 'a' in comment:
        raise ValidationError('Not a')

前端页面手写效果图

4. View层

from get_app.form import CommentForm
def detail(request):
    # 获取表单,用get方法
    if request.method == 'GET':
        form = CommentForm      #表单实例化
    # 表单填写完了,要提交数据,就要POST方法
    if request.method == 'POST':
        # 绑定表单,绑定后会进行表单的验证,并加入列表中
        form = CommentForm(request.POST)
        # 判断校验是否通过,is_valid方法会返回一个bool
        if form.is_valid():
            # 通过验证后,数据会储存在cleaned_data(字典结构)中,并取出名字叫name的post信息
            name = form.cleaned_data['name'],
            comment = form.cleaned_data['comment']
            # 存储到数据库
            c = Comment(name=name, comment=comment)
            c.save()
            # redirect()重定向,即跳转,detail为url中的name
            return redirect(to='detail')
    
    comment_list = Comment.objects.all()
    context = {
        'comment_list': comment_list,
        'form': form,
    }
    return render(request, 'detail.html', context)

5. Template层