Django-ModelForm Django之ModelForm組件


做者:武沛齊 
出處:Django之ModelForm組件css

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。html

 

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={...})

 

一個實例:jquery

1. models.py數據庫

 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.pydjango

 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. templatesjson

 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
 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
相關文章
相關標籤/搜索