Django使用普通表单、Form、以及modelForm操作数据库方式总结

 Django使用普通表单、Form、以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样:
    进入填写表单页面;
    在表单页面填写信息,并提交;
    表单数据验证
    验证成功,和数据库进行交互(增删改查);
    验证成功,页面提示表单填写失败;

一、Django使用普通表单操作数据库
1、html代码:

 
  {% csrf_token %}

  

用户:

  

用户年龄:

  

2、点击增加后,页面判断填写字段是否合法(使用JavaScript或JQuery实现判断)
前端校验后,在/add/对应的view对数据进行校验以及数据保存

from polls.models import Person #导入对应model
from django.http import HttpResponseRedirecdef addbooktodatabase(request):
    # 获取参数前端传递的参数
    if request.method == "GET":
        author_name = request.GET["author"]
        author_age = request.GET["author_age"]
    else:
        author_name = request.POST["author"]
        author_age = request.POST["author_age"]
   #对前端参数按业务逻辑进行校验

  #代码省略 
    ## 保存数据到数据库
    person = Person()
    person.name = author_name
    person.age = author_age
    person.save()
 
    return HttpResponseRedirect('/addok/')

二、Django使用自有插件Form表单操作数据库
   和方法一的使用普通表单相比,使用django的Form表单更方便快捷地生成前端form表单以及对字段的校验规则;

from django.shortcuts import render, HttpResponse, redirect
from django.forms import Form, fields, widgets
from model import * #导入对应的model

#Form验证
class TestForm(Form):
    inp1 = fields.CharField(min_length=4, max_length=8)
    inp2 = fields.EmailField()
    inp3 = fields.IntegerField(min_value=10, max_value=100)

View文件如下(添加):
def test(request):
    if request.method == 'GET':
        obj = TestForm()
        return render(request, 'test.html', {'obj': obj})
    else:
        form = TestForm(request.POST)
        if obj.is_valid():
          #验证合格,前端的数据保存在form.cleaned_data,model的create函数保存到数据库

      obj = models.Article.objects.create(**form.cleaned_data)
      models.ArticleDetail.objects.create(content=content, article=obj)

          return HttpResponse('提交成功')

如果是修改,相应代码改成:

obj = admin_obj.model.objects.get(id=obj_id)
if request.method == "GET":
    obj_form = model_form(instance=obj)
elif request.method == "POST":
    obj_form = model_form(instance=obj,data=request.POST)
    if obj_form.is_valid():
        obj_form.save()

html文件如下:




    
    Title


{% csrf_token %}

输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}

输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}

输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}

三、Django使用插件modelForm表单操作数据库

和方法二的使用表单Form相比,modelForm具有Form中所有的验证钩子,使用django的modelForm表单不需要重新定义Form,比较方便。
缺点是和数据库model耦合性太强;
Model

class Article(models.Model):
    title = models.CharField(max_length=20, unique=True)
    author = models.ForeignKey('Author')

ModelForm

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article #对应的model
        fields = "__all__"      #或('name','email','user_type')    #验证哪些字段,"__all__"表示所有字段

        exclude = None          #排除的字段
        labels = None           #提示信息
        help_texts = None       #帮助提示信息
        widgets = None          #自定义插件
        error_messages = None   #自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
        field_classes = None    #自定义字段类(也阔以自定义字段)
        localized_fields = ()   #本地化,根据settings中TIME_ZONE设置的不同时区显示时间
 
        def clean_username(self):
      value = self.cleaned_data['username']
      if value == 'root':
          return value
      else:
          raise ValidationError("你不是管理员!")

View文件如下:

def test(request):
    if request.method == 'GET':
        obj = ArticleForm()
        return render(request, 'test.html', {'obj': obj})
    else:
        form = ArticleForm(request.POST)
        if obj.is_valid():
          #验证合格,前端的数据保存在到数据库
      form.save() #默认save(commit=True),默认保存多对多,当commit=False时可以拆分保存操作
          return HttpResponse('提交成功')

html文件如下:




    
    Title


{% csrf_token %}

输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}

输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}

输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}

 

你可能感兴趣的:(#,Django)