做者:武沛齊
出處: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
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)
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>
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>