Django_modelform组件

modelForm 组件

概念

  将数据库与form 组件结合用起来的中间插件

与 form 组件的区别

  

  form组件的难处:  

    form 可以实现 对数据的验证以及 form 的表单标签的生成

    但是她做不到一点就是无法将数据库串联起来,无法做到数据的传回

      比如编辑页面的时候无法拿到当前正要被编辑的值

  

  modelfom 组件在 form组件的基础上进行升级 :

    自动创建 form 类 (将model类 转换成 form类)

      在 from类手动创建的是时候就可以发现,form 的创建和 model 的数据库几乎完全一致

      而modelform 可以帮我们直接实现这个操作而不在需要手动创建

    直接和 model 对应上,对于 model 的增删改查会更加的简单便捷  

 创建关联

   用form 组件的形式创建

class Book(models.Model):

    title=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=8,decimal_places=2)  # 999999.99
    date=models.DateField()
    publish=models.ForeignKey("Publish")
    authors=models.ManyToManyField("Author")


class BookForm(forms.Form):
    title = forms.CharField(max_length=32,label="书籍名称")
    price = forms.DecimalField(max_digits=8, decimal_places=2,label="价格")  # 999999.99
    date = forms.DateField(
          label="日期",
             widget=widgets.TextInput(attrs={"type":"date"})
        )
    publish=forms.ModelChoiceField(queryset=Publish.objects.all())
    authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())

    用modelform 组件的形式创建

class BookForm(ModelForm):
    class Meta:
        model=Book # 制定要被转换的表
        fields="__all__"  # 控制要被转换的字段 , __all__ 表示所有字段 ,除了 用 __all__ 的时候对多个字段使用的时候用列表的形式
     # fields=["title","price"]  # 除了 用 __all__ 的时候用字符串形式,对多个字段使用的时候用列表的形式

一些比较常见的仓鼠:

from django.forms import ModelForm
#在视图函数中,定义一个类,比如就叫StudentList,这个类要继承ModelForm,在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的)
#在这个原类中,有以下属性(部分):

class StudentList(ModelForm):
    class Meta:
      
      model
=Student #对应的Model中的类 fields = "__all__" #字段,如果是__all__,就是表示列出所有的字段 exclude = 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":"用户名" }

数据传回

对当前编辑的对象的数据的取回,在form 组件的时候是无法操作的

  form 类在实例化对象的时候无法接受参数

  modelform 组件可以 以instance参数接受一个对象  

save 的使用

  对于数据的编辑更新和新建,modelform 类统一使用 .save() 方法

  当 当前的 modelform 对象中没有 instance参数的时候默认添加一个新对象

  当 当前的 modelform 对象中有 instance参数的时候会按照参数的中的对象进行更新操作

    (不给对象参数的话怎么知道要编辑哪一个呢?)

def addbook(request):
    if request.method == "POST":
        form = BookForm(request.POST)
        if form.is_valid():
            form.save()    # form.model.objects.create(request.POST)
            return redirect("/books/")
        else:
            return render(request, "add.html", locals())
    form=BookForm()
    return render(request, "add.html", locals())


def editbook(request, edit_book_id):
  # 被编辑的书的对象 edit_book
= Book.objects.filter(pk=edit_book_id).first() if request.method == "POST": form = BookForm(request.POST, instance=edit_book) if form.is_valid(): form.save() # edit_book.update(request.POST) return redirect("/books/")
form
=BookForm(instance=edit_book) return render(request, "edit.html",locals())

猜你喜欢

转载自www.cnblogs.com/shijieli/p/10191649.html
今日推荐