Django-ModelForm


作者:武沛齐 
出处:Django之ModelForm组件

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

 

ModelForm
    a.  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',) # 本地化,如:根据不同时区显示数据
            如:
                数据库中
                    2016-12-27 04:10:57
                setting中的配置
                    TIME_ZONE = 'Asia/Shanghai'
                    USE_TZ = True
                则显示:
                    2016-12-27 12:10:57
    b. 验证执行过程
        is_valid -> full_clean -> 钩子 -> 整体错误
 
    c. 字典字段验证
        def clean_字段名(self):
            # 可以抛出异常
            # from django.core.exceptions import ValidationError
            return "新值"
    d. 用于验证
        model_form_obj = XXOOModelForm()
        model_form_obj.is_valid()
        model_form_obj.errors.as_json()
        model_form_obj.clean()
        model_form_obj.cleaned_data
    e. 用于创建
        model_form_obj = XXOOModelForm(request.POST)
        #### 页面显示,并提交 #####
        # 默认保存多对多
            obj = form.save(commit=True)
        # 不做任何操作,内部定义 save_m2m(用于保存多对多)
            obj = form.save(commit=False)
            obj.save()      # 保存单表信息
            obj.save_m2m()  # 保存关联多对多信息
 
    f. 用于更新和初始化
        obj = model.tb.objects.get(id=1)
        model_form_obj = XXOOModelForm(request.POST,instance=obj)
        ...
 
        PS: 单纯初始化
            model_form_obj = XXOOModelForm(initial={...})

 

一个实例:

1. models.py

ContractedBlock.gif ExpandedBlockStart.gif
 1 from django.db import models
 2 
 3 # Create your models here.
 4 
 5 
 6 class UserInfo(models.Model):
 7     name = models.CharField(max_length=32)
 8     email = models.EmailField()
 9     nickName = models.CharField(max_length=32)
10     group = models.ForeignKey('UserGroup', null=True, blank=True)
11     role = models.ManyToManyField('Role', null=True, blank=True)
12 
13     def __str__(self):
14         return self.name
15 
16 
17 class UserGroup(models.Model):
18     name = models.CharField(max_length=32)
19     info = models.TextField()
20 
21     def __str__(self):
22         return self.name
23 
24 
25 class Role(models.Model):
26     name = models.CharField(max_length=32)
27     info = models.TextField()
28 
29     def __str__(self):
30         return self.name
View Code

2. views.py

ContractedBlock.gif ExpandedBlockStart.gif
 1 from django.shortcuts import render,HttpResponse
 2 from django.forms import ModelForm
 3 from django.forms import fields as dfields
 4 from django.forms import widgets as dwidgets
 5 from app01 import models
 6 
 7 
 8 class TestModelForm(ModelForm):
 9     class Meta:
10         model = models.UserInfo
11         fields = '__all__'
12         error_messages = {
13             'name': {
14                 'required': '用户名不能为空',
15             },
16             'email': {
17                 'required': '邮箱不能为空',
18                 'invalid': '邮箱格式不正确',
19             },
20             'nickName': {
21                 'required': '昵称不能为空',
22             }
23         }
24         labels = {
25             'name': '用户名',
26             'email': '邮箱',
27             'nickName': '昵称',
28             'group': '部门',
29             'role': '角色',
30         }
31         widgets = {
32             'name': dwidgets.Input(attrs={'class': 'form-control'}),
33             'email': dwidgets.Input(attrs={'class': 'form-control'}),
34             'nickName': dwidgets.Input(attrs={'class': 'form-control'}),
35             'group': dwidgets.Select(attrs={'class': 'form-control'}),
36             'role': dwidgets.SelectMultiple(attrs={'class': 'form-control'}),
37         }
38 
39 # Create your views here.
40 
41 
42 def test(request):
43     content = {'form': None}
44     if request.method == 'GET':
45         form = TestModelForm()
46         content['form'] = form
47         return render(request, 'test.html', content)
48     else:
49         form = TestModelForm(request.POST)
50         content['form'] = form
51         if form.is_valid():
52             print(form.cleaned_data)
53             form.save()
54             return HttpResponse('add success!')
55         else:
56             return render(request, 'test.html', content)
57 
58 
59 def edit(request, nid):
60     obj = models.UserInfo.objects.filter(id=nid).first()
61     content = {'form': None}
62     if request.method == 'GET':
63         form = TestModelForm(instance=obj)
64         content['form'] = form
65         return render(request, 'edit.html', content)
66     else:
67         form = TestModelForm(instance=obj, data=request.POST, files=request.FILES)
68         if form.is_valid():
69             form.save()
70             return HttpResponse('edit success!')
71         content['form'] = form
72         return render(request, 'test.html', content)
View Code

3. templates

ContractedBlock.gif ExpandedBlockStart.gif
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
 6     <title>Title</title>
 7 </head>
 8 <body>
 9 <form method="post" novalidate>
10     {% csrf_token %}
11     <div class="form-group" style="width: 300px; margin: 50px auto;">
12         {{ form.as_p }}
13         <input type="submit" value="提交">
14     </div>
15 </form>
16 
17 <script src="/static/jquery-3.2.1.js"></script>
18 </body>
19 </html>
test.html
ContractedBlock.gif ExpandedBlockStart.gif
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
 6     <title>Title</title>
 7 </head>
 8 <body>
 9 <form method="post" novalidate>
10     {% csrf_token %}
11     <div class="form-group" style="width: 300px; margin: 50px auto;">
12         {{ form.as_p }}
13         <input type="submit" value="提交">
14     </div>
15 </form>
16 
17 <script src="/static/jquery-3.2.1.js"></script>
18 </body>
19 </html>
edit.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值