Django modelforms

Model:强大的数据管理,弱小的数据验证

Form:强大的数据验证,弱小的数据管理

已经是2个强大的模块了,Django为了在小型项目上更加方便简单的使用者2个功能,提供了ModelForms,(admin 使用的就是ModelForms).

  优点: 方便简单,

  缺点: 耦合性太强.

 

ModelForms的使用,只需简单三步:

1.先在models创建表,万年不变的book,author,press:

from django.db import models

# Create your models here.
class Book(models.Model):
    name_B=models.CharField(max_length=32)
    author=models.ForeignKey("Author",on_delete=models.CASCADE)
    press=models.ManyToManyField("Press")
class Author(models.Model):
    name_A=models.CharField(max_length=32)
    profile=models.CharField(max_length=32)
class Press(models.Model):
    name_P=models.CharField(max_length=32)
    address=models.CharField(max_length=32)

2.写ModelsForms,(任意位置,最好单独写在一个py文件里):

from django import forms
from django.forms import fields
from myp001 import models

class mfbook(forms.ModelForm):
    class Meta:
#必要的2个字段
        model=models.Book#-----------固定字段,绑定models里面的表,注意是Book不是Book()
        fields="__all__"#-------------固定字段,想要获取表里面的哪些列,all代表所有
#####此处省略各种参数,后面介绍

3.view里面导入写好的ModelForms,创建对象,将对象传到前端,搞定!

from django.shortcuts import render
from utils import mf
# Create your views here.
def mflg(req):
    if req.method=="GET":
        obj=mf.mfbook()
        return render(req,"mfh.html",{'obj':obj})

,前端写上{{obj.as_p}},效果如下:

这就弄好了!想要验证数据也很简单,由于ModelForms继承的 BaseModelForm---BaseForm,所以forms的所有验证方法都能用:

views:

def mflg(req):
    if req.method=="GET":
        obj=mf.mfbook()
        return render(req,"mfh.html",{'obj':obj})
    elif req.method=="POST":
        obj=mf.mfbook(req.POST)#用法和forms一样
        print(obj.is_valid())
        print(obj.cleaned_data)
        print(obj.error)

 然后就是models的功能了:

添加:

1.将获取到的数据经过验证后直接添加save()--增

views:

from django.shortcuts import render
from utils import mf
# Create your views here.
def mflg(req):
    if req.method=="GET":
        obj=mf.mfbook()
        return render(req,"mfh.html",{'obj':obj})
    elif req.method=="POST":
        obj=mf.mfbook(req.POST)#用法和forms一样
        if obj.is_valid():
            obj.save()
        #这样就添加了,
        ###这里save()里面还有个参数commit,默认是True,意思就是所有数据都添加,如果等于False,就是只添加当前models对象,不会添加多对多的对象
        # 我们可以自己制定制定添加那些数据
        # instance = obj.save(False)
        # instance.save()保存当前models对象
        # obj.save_m2m()保存多对多对象
    
    return render(req,"mfh.html",{'obj':obj})

 

2,用到instance=一个字段对象:查

###urls:
from django.contrib import admin
from django.urls import path,include,re_path
from myp001 import views
urlpatterns = [
    path('admin/', admin.site.urls),

    re_path(r'/mf001_(\d+)',views.mflg)
]
###html:
<form action="/myp001/mf001_{{ nid }}" method="POST">
    {{ obj.as_p }}
    <input type="submit" value="提交">

</form>
###views
from django.shortcuts import render
from utils import mf
from myp001 import models
# Create your views here.
def mflg(req,nid):#nid接收path传过来的参数
    if req.method=="GET":
        m_obj=models.Book.objects.get(id=nid)
        obj=mf.mfbook(instance=m_obj)
        return render(req,"mfh.html",{'obj':obj,'nid':nid})

输入:http://localhost:8081/myp001/mf001_2得如下显示(把字段内容全部渲染在了页面上):

3.改,类似查

 

###urls:
from django.contrib import admin
from django.urls import path,include,re_path
from myp001 import views
urlpatterns = [
    path('admin/', admin.site.urls),

    re_path(r'/mf001_(\d+)',views.mflg)
]
###html:
<form action="/myp001/mf001_{{ nid }}" method="POST">
    {{ obj.as_p }}
    <input type="submit" value="提交">

</form>
###views
from django.shortcuts import render
from utils import mf
from myp001 import models
# Create your views here.
def mflg(req,nid):#nid接收path传过来的参数
    if req.method=="GET":
        m_obj=models.Book.objects.get(id=nid)
        obj=mf.mfbook(instance=m_obj)
        return render(req,"mfh.html",{'obj':obj,'nid':nid})
    elif req.method=="POST":
        m_obj = models.Book.objects.get(id=nid)
        obj=mf.mfbook(req.POST,instance=m_obj)#########
        if obj.is_valid():
            obj.save()
            return render(req, "mfh.html", {'obj': obj})

这样写django还帮我们处理了当数据库修改后页面上的字段没有修改的问题(详见写的django modles篇幅).

删除操作过于简单,直接获取对象delect 就是删除了,ModelsForms里面没有直接操作删除的.

下面介绍下ModelsForms 中其他字段功能:

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在class xxx(forms.ModelForm):

  class meta:

  各种字段

1.model-----用于绑定models中的某个表,值能绑定一个

2.fields------绑定字段,全部用__all__表示,多个字段用迭代对象表示:

class mfbook(forms.ModelForm):
    class Meta:
        model=models.Book
        fields="__all__"#全部字段
        fields=['name_B','author']#某些字段

3.exclude-----除开那些字段

class mfbook(forms.ModelForm):
    class Meta:
        model=models.Book
        exclude=["name_B"]

4.labels-----前缀信息:

class mfbook(forms.ModelForm):
    class Meta:
        model=models.Book
        fields="__all__"#全部字段
        labels={
            "name_B":'姓名',
            'author':'sb'
        }

5.help_texts -----帮助信息,在生成标签后面显示帮助信息:

class mfbook(forms.ModelForm):
    class Meta:
        model=models.Book
        fields="__all__"#全部字段 
        help_texts={
            "name_B":'sb请写名字',
            'author':'sb作者'
        }

6.widgets----自定义表现显示,和form一样:

from django.forms import fields,widgets as ws#需要导入widgets包,避免重名as ws区别

class mfbook(forms.ModelForm):
    class Meta:
        model=models.Book
        fields="__all__"#全部字段

        widgets={
            "name_B": ws.Textarea(attrs={'class':'n'}),#自定义标签,也可以加属性
        }

7. error_messages-----错误信息:

class mfbook(forms.ModelForm):
    class Meta:
        model=models.Book
        fields="__all__"#全部字段
  
        error_messages={
            "name_B":{'require':'请输入你的名字',"invalid":"无效的名字"},
        }

8.field_classes-------自定义验证字段,二次验证,在models验证之后再做验证:

class mfbook(forms.ModelForm):
    class Meta:
        model=models.Book
        fields="__all__"#全部字段
        field_classes={
            "name_B": forms.Emailfield#将这个字段改成邮箱验证方式,注意这里只能写成类的形式,不能加()
        }

9.在ModelsForms里面添加Forms字段,字段添加后与数据库无关,只是显示页面和验证,与db存储无关,如与models里面的字段重名,则覆盖models里面的字段:

class mfbook(forms.ModelForm):
    email=forms.EmailField()#覆盖models里面的字段
    pwd=forms.CharField()#在页面多显示字段
    class Meta:
        model=models.Book
        fields="__all__"#全部字段

 

 

 
posted @ 2018-01-29 23:29  SSSupreme  阅读(212)  评论(0)    收藏  举报