Django之ModelForm实例

网上对ModelForm的解释;
1.Django中Model负责操作数据库,并且具有简单的数据库验证功能(基本不用);Form用于用户请求的验证,具有强悍的数据库验证功能;ModelForm是将二者合二为一即可用于数据库操作(部分),也可用于用户请求的验证(部分)!但由于ModelForm的耦合性太强,其作用一般用作于结构简单的小站点或者重写Django Admin,其实Django Admin就是利用ModelForm的功能实现的。
解释1
2.ModelForm是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来。先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢?首先我们会在前端一个一个罗列出这些字段,让用户去填写,然后我们从后天一个一个接收用户的输入,创建一个新的学生对象,保存起来。其实,重点不是这些,而是合法性验证,我们需要在前端判断用户输入是否合法,比如姓名必须在多少字符以内,电话号码必须是多少位的数字,邮箱必须是邮箱的格式这些。当然可以一点一点手动写限制,各种判断,这毫无问题,不过比较麻烦。我们现在有个更优雅的方法:ModelForm
解释2

下面以一个例子来讲解。

假设有这样一个数据库demo2,我们建了一个blog表,字段为(title,body,timestamp)我们想实现这个功能:前端页面可以增加blog文章,而且时间戳timestamp自己添加为系统当前时间。

models.py如下:

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    timestamp = models.DateTimeField()

然后在app文件夹下建立forms.py

from django import forms
from app import models

class BlogModelForm(forms.ModelForm):
    class Meta:
        model = models.Blog    #与models建立了依赖关系
        #fields = "__all__"
        fields = {'title','body'}
        labels = {
            'title':'标题',
            'body':'内容',
        }
        
        #这里可以实现各种表单验证功能,出于简单考虑
        #本例只展示大致思路,验证功能以后添加

视图文件views.py

from django.shortcuts import render,HttpResponse
from datetime import datetime
from app import forms

def delFormTest(request):
    if request.method == "POST":
        obj = forms.BlogModelForm(request.POST)
        if obj.is_valid():
            post = obj.save(commit=False)    
            post.timestamp = datetime.now()    #向数据添加时间戳
            post.save()
            return HttpResponse("数据提交成功!!")
    else:
        obj = forms.BlogModelForm()
        return render(request, "ModelFormTest.html", {'obj': obj})

这里有一处需要注意:因为时间戳需要自动添加系统的时间,所以注意post = obj.save(commit=False)中是对表单的save(),不是模型的save(),这个save()返回的是Blog模型的实例,但由于commit=False,因此在调用post.save()之前不会保存数据,然后添加时间戳后就可以正常保存表单了。

ModelFormTest.html文件:




    
    首页


{% csrf_token %} {{ obj }}

应用app下的urls.py

from django.urls import path
from app import views

urlpatterns = [
    path('index/',views.index),
    path('add/',views.add),
    path('ModelFormTest/',views.ModelFormTest),
]

执行python manage.py runserver 时报了一个错误:
在这里插入图片描述
看上去应该是编码错误,我就试图去错误中给出的路径下(python解释器下)的debug.py文件进行修改:在这里插入图片描述
Django之ModelForm实例_第1张图片
在这里插入图片描述
加上encoding='UTF-8',然后执行python manage.py runserver,没想到能正确执行。
Django之ModelForm实例_第2张图片
Django之ModelForm实例_第3张图片
Django之ModelForm实例_第4张图片

你可能感兴趣的:(Django之ModelForm实例)