首页 > 其他 > 详细

Django学习之ModelForm

时间:2019-12-18 21:24:57      阅读:96      评论:0      收藏:0      [点我收藏+]

    Django中Model支持强大的数据库操作,弱小的数据验证、Form有强大数据验证、ModelForm把2者结合起来,有强大的数据验证,适中的数据库操作。本文主要介绍ModelForm使用。

技术分享图片
from django.db import models
from django.core.validators import RegexValidator

class User(models.Model):
    name = models.CharField(max_length=10)
    email = models.EmailField(max_length=10)
    user_type = models.ForeignKey(UserType,on_delete=models.CASCADE)  # 一对多

class UserType(models.Model):
    name = models.CharField(max_length=10)

    def __str__(self):
        return self.name
models.py
技术分享图片
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from app01.view import mf
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^index/, views.index),
    url(r^fm/, views.fmindex),
    url(r^mf/, mf.index),
    url(r^edit-mf-(\d+)/, mf.edit_index),
]
from django.conf import settings
if settings.DEBUG:
    import debug_toolbar
    urlpatterns += [
        url(r^__debug__/, include(debug_toolbar.urls)),
    ]
urls.py
技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/mf/" method="POST">
    {{ obj.as_p }}
        <input type="submit" value="提交" />
    </form>
</body>
</html>
mf.html
技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/edit-mf-{{nid}}/" method="POST">
    {{ obj.as_p }}
        <input type="submit" value="提交" />
    </form>
</body>
</html>
mf1.html
技术分享图片
from django.shortcuts import render
from django import forms
from app01 import models

class UserModelForm(forms.ModelForm):
    class Meta:
        model = models.User
        fields = "__all__"
        labels = {name:用户名,email:邮箱,user_type:用户类型}


def index(request):
    if request.method == "GET":
        obj = UserModelForm()
        return render(request,mf.html,{obj: obj})
    elif request.method == "POST":
        obj = UserModelForm(request.POST)
        if obj.is_valid():
            # print(obj.cleaned_data)
            # models.User.objects.create(**obj.cleaned_data)
            obj.save(commit=True) #可以直接获取用户输入信息保存信息到数据库,包括一对多及多对多
            """
            mobj = obj.save(commit=False)
            mobj.save()
            obj.save_m2m()
            """
        print(obj.errors)
        return render(request, mf.html, {obj: obj})

def edit_index(request,nid):
    if request.method == "GET":
        model_obj = models.User.objects.get(id=nid)
        obj =UserModelForm(instance=model_obj)
        return render(request, mf1.html, {obj: obj,nid: nid})
    elif request.method == POST:
        model_obj = models.User.objects.get(id=nid)

        obj = UserModelForm(request.POST, instance=model_obj) #有instance代表是更新数据
        if obj.is_valid():
            obj.save()
        return render(request, mf1.html, {obj: obj})
views.py

技术分享图片

 

 技术分享图片

     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,) # 本地化,如:根据不同时区显示数据

    使用示例

rom django.forms import ModelForm
from django.forms import widgets

from  rbac import models


class Userform(ModelForm):
    class Meta:
        model = models.User
        fields = "__all__"
        help_texts={name:"请输入用户名"}
        labels = {name:用户名,email:邮箱,user_type:用户类型}

        error_messages = {
            username:{required:名称不能为空,invalid:格式错误},
            password:{required:名称不能为空,invalid:格式错误}
        }

        widgets = {
            username:widgets.TextInput(attrs={class:form-control,placeholder:username}),
            password:widgets.TextInput(attrs={class:form-control,placeholder:password})
        }

 

Django学习之ModelForm

原文:https://www.cnblogs.com/quanloveshui/p/12061648.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!