django组件-modelform(代码片段)

zbw582922417 zbw582922417     2023-01-21     275

关键词:

ModelForm

组件功能就是把model和form组合起来.

首先导入ModelForm

from django.forms import ModelForm

在视图函数中,定义一个类,比如就叫StudentList,这个类要继承ModelForm,在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的)

在这个原类中,有以下属性(部分):

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(attrs="class":"c1")  #还可以自定义属性

#labels,自定义在前端显示的名字
        labels = 
                 "name":"用户名"  

如果想增加一个字段,就在class Meta 之前写这个字段

然后在url对应的视图函数中实例化这个类,把这个对象传给前端

def student(request):
    
    if request.method == GET:
        student_list = StudentList()
        return render(request,student.html,student_list:student_list)

然后前端只需要 student_list.as_p 一下,所有的字段就都出来了,可以用as_p显示全部,也可以通过for循环这student_list,拿到的是一个个input框,现在我们就不用as_p,手动把这些input框搞出来,as_p拿到的页面太丑。

首先 for循环这个student_list,拿到student对象,直接在前端打印这个student,是个input框

student.label  ,拿到数据库中每个字段的verbose_name ,如果没有设置这个属性,拿到的默认就是字段名

还可以通过student.errors.0 拿到错误信息,还有student.field,是拿到每个字段,如果这个字段是多对多字段,还能stuent.field.queryset,拿到所有关联的字段,还能stuent.field.queryset.model,拿到所有关联的字段的类

有了这些,我们就可以通过bootstrap,自己拼出来想要的样式了

 比如:

<body>
    <div class="container" >
        <h1>student</h1>
        <form method="POST" novalidate>
            % csrf_token %
#             student_list.as_p #
            % for student in student_list %
                <div class="form-group col-md-6">
                 # 拿到数据字段的verbose_name,没有就默认显示字段名 #
                    <label class="col-md-3 control-label"> student.label </label>
                   <div class="col-md-9" style="position: relative;"> student </div>
                </div>
            % endfor %

            <div class="col-md-2 col-md-offset-10">
                <input type="submit" value="提交" class="btn-primary">
            </div>

        </form>
    </div>
</body>

复制代码

现在还缺一个input框的form-control样式,可以考虑在后台的widget里面添加

比如这样:

from django.forms import widgets as wid  #因为重名,所以起个别名
        widgets = 
            "name":wid.TextInput(attrs=class:form-control),
            "age":wid.NumberInput(attrs=class:form-control),
            "email":wid.EmailInput(attrs=class:form-control)
        

当然也可以在js中,找到所有的input框,加上这个样式,也行

 

 

保存数据的时候,不用挨个取数据了,只需要save一下

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 redirect(request,student_list.html,student_list:student_list)

编辑数据:

如果不用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)
View Code

对于验证规则,很多浏览器都比较智能,会自动帮我们做一些验证,可以在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’)
        ...

 

django框架之modelform组件(代码片段)

浏览目录创建mldelform添加记录编辑记录 Django框架中的modelform组件通过名字我们可以看出来,这个组件的功能就是把model和form组合起来。下面我们来看一个例子:比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱... 查看详情

django框架之modelform组件(代码片段)

浏览目录创建mldelform添加记录编辑记录 Django框架中的modelform组件通过名字我们可以看出来,这个组件的功能就是把model和form组合起来。下面我们来看一个例子:比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱... 查看详情

django——form组件和modelform(代码片段)

一、原生form实现书城增删改查1、构建模型并完成数据库迁移(1)构建书城模型fromdjango.dbimportmodels#Createyourmodelshere.#创建一个图书管理系统的模型classBook(models.Model):title=models.CharField(max_length=32)price=models.DecimalField(max_digits=8, 查看详情

django组件-modelform(代码片段)

模型表单ModelForm一、基本用法?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172fromdjangoimportformsfromdjango.utils.safestringimportmark_safefromdjango.core.exceptionsimportValidationErrorfromrbacimportm... 查看详情

django-组件拾遗(代码片段)

知识预览一Django的form组件二Django的modelform组件三Django的缓存机制四Django的信号五Django的序列化一Django的form组件forms组件二Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合... 查看详情

django组件拾忆(代码片段)

知识预览一Django的form组件二Django的modelform组件三Django的缓存机制四Django的信号五Django的序列化回到顶部一Django的form组件回到顶部二Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model... 查看详情

django-缓存机制,form组件(代码片段)

知识预览一Django的form组件二Django的modelform组件三Django的缓存机制四Django的信号五Django的序列化回到顶部一Django的form组件回到顶部二Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model... 查看详情

modelform组件(代码片段)

Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,... 查看详情

django之modelform组件(代码片段)

  1ModelForm2a.classMeta:3model,#对应Model的4fields=None,#字段5exclude=None,#排除字段6labels=None,#提示信息7help_texts=None,#帮助提示信息8widgets=None,#自定义插件9error_messages=None,#自定义错误信息(整体错误信息fromdjango.core.exceptionsimportNON_FIELD_ERRO... 查看详情

django之modelform组件(代码片段)

1ModelForm2a.classMeta:3model,#对应Model的4fields=None,#字段5exclude=None,#排除字段6labels=None,#提示信息7help_texts=None,#帮助提示信息8widgets=None,#自定义插件9error_messages=None,#自定义错误信息(整体错误信息fromdjango.core.exceptionsimportNON_FIELD_ERRORS)1... 查看详情

django之modelform详解(代码片段)

ModelForm是Django中编写基于Model定制表单的方法,可以提高Model复用性。 使用时Django会根据 django.db.models.Field (用于数据库衔接)自动转化为 django.forms.Field (用于表单前端展示、后端验证)。  编辑数据:如果... 查看详情

django之modelform(代码片段)

ModelForm: 应用场景:         -ModelForm-中小型应用程序。因为ModelForm是依赖于models的         -Form    & 查看详情

django之modelform(代码片段)

要说ModelForm,那就先说Form吧!先给出一个Form示例:models.pyfromdjango.dbimportmodelsclassUserType(models.Model):caption=models.CharField(max_length=32)classUserGroup(models.Model):name=models.CharField(max_length=32) 查看详情

django之modelform组件

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950ModelForm    a.  class Meta:       &nbs 查看详情

django之modelform(代码片段)

简介Model+Form==>ModelForm。model和form的结合体,所以有以下功能:验证数据库操作Form回顾models.pyclassUserType(models.Model):caption=models.CharField(max_length=32)classUserInfo(models.Model):username=models.CharField(max_le 查看详情

django之modelform组件

Django之ModelForm组件 ModelForma.classMeta:model,#对应Model的fields=None,#字段exclude=None,#排除字段labels=None,#提示信息help_texts=None,#帮助提示信息widgets=None,#自定义插件error_messages=None,#自定义错误信息(整体错误信息fromdjango.co 查看详情

[django]django的modelform处理数据(代码片段)

django的form处理数据1.生成html2.验证数据合法性3.直接存库定义1个formclassBlogPost(models.Model):title=models.CharField(max_length=150)body=models.TextField()timestamp=models.DateTimeField()以前是这样的classBlogPostForm(forms.For 查看详情

django之modalform(代码片段)

ModelForm自己定义的form---&gt;Form---&gt;BaseForm自己定义的ModelForm---&gt;ModelForm---&gt;BaseModelForm---&gt;BaseForm从上面可以看出form和ModelForm都是继承BaseForm,所以在Form中有的方法在ModelForm中也是有的,包括is_vali 查看详情