Django学习之ModelForm

    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'})
        }

猜你喜欢

转载自www.cnblogs.com/quanloveshui/p/12061648.html