用 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)