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


        Django使用普通表单、Form、以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样:

    1. 进入填写表单页面;
    2. 在表单页面填写信息,并提交;
    3. 表单数据验证
    4. 验证成功,和数据库进行交互(增删改查);
    5. 验证成功,页面提示表单填写失败;

    一、Django使用普通表单操作数据库

    1、html代码:

     <form action="/add/" method="post" name="addbook">

      {% csrf_token %} <p>

      <p><span>用户:</span><input type="text" placeholder="用户" name="author"></p>

      <p><span>用户年龄:</span><input type="text" placeholder="用户年龄" name="author_age"></p>

      <input type="submit" value="增加">

    </form>

     

    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文件如下:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <form action="/test/" method="post" novalidate>
    {% csrf_token %}
    <p>输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p>
    <p>输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p>
    <p>输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p>
    <input type="submit" value="提交">
    </form>
    </body>
    </html>

    具体Form在前端展示以及校验方式、以及操作model的方式(增删改查)不展开,此处主要说明方式

     

    三、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文件如下:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <form action="/test/" method="post" novalidate>
    {% csrf_token %}
    <p>输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p>
    <p>输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p>
    <p>输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p>
    <input type="submit" value="提交">
    </form>
    </body>
    </html>


        
     

     

     

  • 相关阅读:
    Linux下利用rsync实现多服务器文件同步
    SVN使用import导入新数据到版本库
    SVN协同开发时服务端与线上APACHE测试环境网站同步记录 转
    [转]rsync的配置与应用
    Matrix 旋转mc 注册点在mc的左上角
    多边形面积计算
    【神奇的代码】
    【碰撞回弹】
    三角函数
    判断点是否在线段或直线上
  • 原文地址:https://www.cnblogs.com/yoyo008/p/9078726.html
Copyright © 2020-2023  润新知