ModelForm基本用法

ModelForm基本用法

from django import forms
from app01 import models


class BookModelForm(forms.ModelForm):
    #必须是这个类名
    class Meta:
        # 告诉Django这个form类和那个model类对应
        model = models.Book
        # 告诉Django这个form类里面有哪些字段
        fields = "__all__"
        widgets = {
            "publish_date": forms.widgets.DateInput(
                # 给日期字段添加日期类型
                attrs={"type": "date"}
            )
        }
        labels = {
            "title": "书名",
            "price": "价格",
            "publish_date": '出版日期',
            "publisher": "出版社名称",
            "authors": "作者"
        }
        error_messages = {
            "title": {
                "required": "书名不能为空"
            }
        }

    # 通过修改类的初始化方法达到批量添加共同属性的目的
    def __init__(self, *args, **kwargs):
        super(BookModelForm, self).__init__(*args, **kwargs)
        # for field_name in self.base_fields:
        for field in iter(self.fields):
            self.fields[field].widget.attrs.update({
                'class': 'form-control'
            })

ModelForm所有属性:

class Meta:
            model,                           # 对应Model的
            fields=None,                     # 字段
            exclude=None,                    # 排除字段
            labels=None,                     # 提示信息
            help_texts=None,                 # 帮助提示信息
            widgets=None,                    # 自定义插件
            error_messages=None,             # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
            field_classes=None               # 自定义字段类 (也可以自定义字段)
            localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据


ModelForm用于验证用户数据:is_valid()

        model_form_obj = XXOOModelForm()   //实例化对象
        model_form_obj.is_valid()   // 校验数据
        model_form_obj.errors.as_json()  //错误
        model_form_obj.clean()   //同Form组件中的属性
        model_form_obj.cleaned_data  // 同Form组件中的属性

ModelForm用于创建数据:save()

def add_book(request):
    if request.method == "POST":
        #直接传request.POST,进行ModelForm的实例化传参
        form_obj = forms.BookModelForm(request.POST)
        if form_obj.is_valid(): # 校验数据
            form_obj.save()   #直接就可以保存数据到数据库,包括多对多,多对一,一对一的关系
            return redirect("/book_list/")
    #ModelForm实例化对象
    form_obj = forms.BookModelForm()
    return render(request, "v2/add_book.html", locals())

ModelForm用于初始化:ModelForm(instance=model_obj)

def edit_book(request, pk):
    book_obj = models.Book.objects.filter(id=pk).first()
    #form_obj通过instance设置初始化的值,例如,图书管理系统中的编辑书籍功能,
    #点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。
    #不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。
    form_obj = forms.BookModelForm(instance=book_obj)  
    return render(request, "v2/edit_book.html", locals())

ModelForm用于更新 :ModelForm(request.POST, instance=book_obj)

def edit_book(request, pk):
    book_obj = models.Book.objects.filter(id=pk).first()
    if request.method == "POST":
        #修改数据时,直接可以将用户数据包request.POST传进去,
        #再传一个要修改的对象的示例,ModelForm就可以自动完成修改数据了。
        form_obj = forms.BookModelForm(request.POST, instance=book_obj)
        if form_obj.is_valid():  // 数据校验
            form_obj.save()   // 直接保存
        return redirect("/book_list/")
    #form_obj通过instance设置初始化的值,例如,图书管理系统中的编辑书籍功能,
    #点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。
    #不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。
    form_obj = forms.BookModelForm(instance=book_obj)  
    return render(request, "v2/edit_book.html", locals())

应用场景

  • ModelForm ---- 中小型应用程序。因为ModelForm是依赖于models的。
  • Form ------- 大型应用程序
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡陌熙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值