zoukankan      html  css  js  c++  java
  • Django之ModelForm详解

    ModelForm 是 Django 中编写基于 Model 定制表单的方法,可以提高 Model 复用性。

    使用时 Django 会根据 django.db.models.Field (用于数据库衔接) 自动转化为 django.forms.Field (用于表单前端展示、后端验证)。

    编辑数据:

    如果不用ModelForm,编辑的时候得显示之前的数据吧,还得挨个取一遍值,如果ModelForm,只需要加一个instance=obj(obj是要修改的数据库的一条数据的对象)就可以得到同样的效果。

    保存的时候要注意,一定要注意有这个对象(instance=obj),否则不知道更新哪一个数据。

    代码示例:

    from django.shortcuts import render,HttpResponse,redirect
    from django.forms import ModelForm
    # Create your views here.
    from app01 import models
    
    def test(request):
    
        # model_form = models.Student
        model_form = models.Student.objects.all()
        return render(request,'test.html',{'model_form':model_form})
    
    
    class StudentList(ModelForm):
        class Meta:
            model = models.Student  #对应的Model中的类
            fields = "__all__"      #字段,如果是__all__,就是表示列出所有的字段
            exclude = None          #排除的字段
            labels = None           #提示信息
            help_texts = None       #帮助提示信息
            widgets = None          #自定义插件
            error_messages = None   #自定义错误信息
    #error_messages用法:
            error_messages = {
                'name':{'required':"用户名不能为空",},
                'age':{'required':"年龄不能为空",},
            }
    
    #widgets用法,比如把输入用户名的input框给为Textarea
    #首先得导入模块
            from django.forms import widgets as wid  #因为重名,所以起个别名
            widgets = {
                "name":wid.Textarea
            }
    #labels,自定义在前端显示的名字
            labels= {
                "name":"用户名"
            }
    def student(request):
    
        if request.method == 'GET':
            student_list = StudentList()
            return render(request,'student.html',{'student_list':student_list})
        else:
            student_list = StudentList(request.POST)
            if student_list.is_valid():
                student_list.save()
            return render(request,'student.html',{'student_list':student_list})
    
    def student_edit(request,pk):
        obj = models.Student.objects.filter(pk=pk).first()
        if not obj:
            return redirect('test')
        if request.method == "GET":
            student_list = StudentList(instance=obj)
            return render(request,'student_edit.html',{'student_list':student_list})
    
        else:
            student_list = StudentList(request.POST,instance=obj)
            if student_list.is_valid():
                student_list.save()
            return render(request,'student_edit.html',{'student_list':student_list})
    
    使用ModelForm编辑数据
    

      

    对于验证规则,很多浏览器都比较智能,会自动帮我们做一些验证,可以在form表单上加  novalidate 属性就可以不让浏览器为我们做验证

    ModelForm还支持所有form的功能,比如钩子,所以我们就可以通过钩子来自定义验证规则

    写法和forms的写法一样:

    class AuthorForm(forms.ModelForm):
        class Meta:
            model = Author
            fields = ('name', 'title')
    
        def clean_name(self):
            if ...
                 return self.clean_data['name']
           else:
                 raise ValidationError(‘sdgsadga’)
            ...
    

      

    https://www.cnblogs.com/DI-DIAO/p/8978780.html

  • 相关阅读:
    双端队列广搜
    多源bfs
    leetcode刷题-67二进制求和
    leetcode刷题-66加一
    leetcode刷题-64最小路径和
    leetcode刷题-62不同路径2
    leetcode刷题-62不同路径
    leetcode刷题-61旋转链表
    leetcode刷题-60第k个队列
    leetcode刷题-59螺旋矩阵2
  • 原文地址:https://www.cnblogs.com/Mengchangxin/p/10855774.html
Copyright © 2011-2022 走看看