ModelForm组件和forms组件补充

Posted neozheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ModelForm组件和forms组件补充相关的知识,希望对你有一定的参考价值。

forms组件补充:

forms组件的三个字段:ChoiceField, ModelChoiceField & ModelMultipleChoiceField

# forms组件:ChoiceField,ModelChoiceField,ModelMultipleChoiceField:这三个可用于渲染 <select> 标签

gender = forms.ChoiceField(choices=((1,""),(2,"")))  # 不与数据库打交道时用 ChoiceField; 语法:forms.ChoiceField(choices=(一个一个的元组))
            
# 和数据库打交道:
# 单选用ModelChoiceField:
publish = forms.ModelChoiceField(queryset=Publish.objects.all())  # 语法:forms.ModelChoiceField(queryset=QuerySet)

# 多选用ModelMultipleChoiceField: 
author = forms.ModelMultipleChoiceField(queryset=Author.objects.all())  # 语法:forms.ModelMultipleChoiceField(queryset=QuerySet)
        

 

ModelForms 组件:

ModelForms组件的作用:验证字段、渲染标签和与数据库的交互

from django import forms
from django.forms import widgets

class BookForm(forms.ModelForm):
    class Meta:
        model = Book  # 这句代码的含义:把Book这张model表能够当成 form组件表去使用;同时 Book 这张model表和 BookForm 表一一对应
        fields = "__all__"   # forms 组件表所使用的字段
        labels = {  # 给字段添加 label
            "title":"书籍名称",
            "price":"价格"
        }
        widgets = { # 给字段添加 widgets
            "title":widgets.TextInput(attrs={"class":"form-control"}),
            "price":widgets.TextInput(attrs={"class":"form-control"}),
            "date":widgets.TextInput(attrs={"class":"form-control","type":"date"}),  # date类型的数据要在 .TextInput(attrs={"type":"date"}) 中 加上 attrs={"type":"date"}
            "publish":widgets.Select(attrs={"class":"form-control"}),  # 单选框要用 Select
            "authors":widgets.SelectMultiple(attrs={"class":"form-control"})  # 多选框要用 SelectMultiple
        }
        error_messages = { # 为字段添加错误信息
            "title":{"required":"不能为空"},
            "price":{"required":"不能为空"},
        }

# 添加书籍信息
def addbook(request):
    if request.method == "POST":
        form = BookForm(request.POST)  # 前端传过来的书籍信息(在request.POST中)传入 BookForm 进行验证
        if form.is_valid():   # ModelForm 拥有 Form组件的方法 # 验证 form 是否合法
            form.save()  # form.save() 就是把该记录保存到 Book 这张model表中; # 因为 BookForm 和 Book 是对应关系,所以 save()时能直接存到 Book 表中

            return redirect("/books/")

    form = BookForm()  # 通过 BookForm 就能把 Book 这张model表当 Form表去使用

    return render(request,"addbook.html",{"form":form})  # 把 form 传入前端,直接渲染



# 编辑书籍信息
def editbook(request,edit_book_id):
    edit_book_obj = Book.objects.filter(pk=edit_book_id).first()

    if request.method == "POST":
        form = BookForm(instance=edit_book_obj,request.POST)
        if form.is_valid:
            form.save()  # 此时 .save()是 update 操作
            """
            当 BookForm()中没有 instance= xx 时, form.save()是 create 操作;当 BookForm()中有 instance=obj 时,此时 form.save()是update 操作,并且是将 request.POST 中的数据更新到 前面的 instance=obj 这个对象中
            """
            return redirect("/books/")

    form = BookForm(instance=edit_book_obj)  # 拿 edit_book_obj 这个所要编辑的书籍对象,放入 BookForm中实例化得到 form,此时form传入前端渲染时,能把 所要编辑的书籍信息直接显示出来:<input>,<select>的value值、selected

    return render(request,"editbook.html",{"form":form})


"""
model表中的 CharField,DateField,EmailField等等,只有在涉及到 ModelForm 的时候才有意义; ModelForm会让model表按照各自的 Field类型转化成相应的 forms 组件
"""

 

以上是关于ModelForm组件和forms组件补充的主要内容,如果未能解决你的问题,请参考以下文章

Django基础十之Form和ModelForm组件

Form和ModelForm组件

Form和ModelForm组件

Form和ModelForm组件1

Django-Form组件-forms.ModelForm

form组件, ModelForm组件