1. 程式人生 > >項目一:CRM(客戶關系管理系統)--11

項目一:CRM(客戶關系管理系統)--11

簡單的 table object pen source 單獨 content lis clas

接著搞起爛攤子。

前面我們簡單的實現了全篇只讀限制,但是存在安全隱患。在解決此隱患之前,我們需要先之道如何實現自定義後臺表單的驗證。

1. 原生admin中自定義表單驗證

說起表單驗證,在前面提過FormMoldeForm的相關使用,這裏我們要通過另一個方法進行處理。

我們通過使用clean()方法實現對全部字段進行驗證操作,clean_name()單獨對每個字段進行驗證處理,其中name對應字段名稱(必須保持一致)。

這些實際的使用方式就不具體介紹了,簡單的介紹一下實現原理:

技術分享圖片

實際的代碼中,我們只需要在定義的From文件中添加即可:

 1 from django import
forms 2 3 class LoginForm(forms.Form): 4 5 def clean_user(self): 6 c = UserProfile.objects.filter(name=self.cleaned_data[‘user’]).count() 7 if not c: 8 return self.cleaned_data[‘user’] 9 else: 10 raise ValueError(“用戶名已經存在”, code=”asdasd”)
11 12 def clean_pwd(self): 13 pass 14 15 def clean(self): # 對整體驗證 16 c = UserProfile.objects.filter(name=self.cleaned_data[“user”], pwd=self.cleaned_data[“pwd”]) 17 if c: 18 return self.cleaned_data 19 else: 20 raise ValueError(“用戶名密碼錯誤”)

這裏只是提供簡單的示例。

2. 構造自定義功能

2.1 所有字段添加自定義clean()驗證

前面我們動態創建了MoelForm的每個具體類,我們要為每個類中添加clean()驗證。既然,我們動態創建了類,那麽對應的類的方法也是很簡單的。

在上面的圖中,我們可以看出clean()方法調用的原理,下面結合之前的只讀限制來使用它,上一篇文章中我們實現了只讀功能,但是並沒有安全的驗證機制,為了安全做如下操作:

這裏先不做多對多的關系處理

2.2 不處理多對多關系

king_admin應用目錄下的forms.py中添加如下代碼:

 1 def __new__(cls, *args, **kwargs):
 2 # 遍歷數據庫的所有字段和字段對應的對象
 3 for field_name, field_obj in cls.base_fields.items():
 4 # 為字段對象的組件添加class屬性
 5 field_obj.widget.attrs[‘class’] = ‘form-control’
 6  
 7 #添加只讀限制
 8 if not hasattr(admin_class, ‘is_add_form’): #排除添加頁面
 9 if field_name in admin_class.readonly_fields:
10 field_obj.widget.attrs[‘disabled’] = ‘disabled’
11 # 創建當前類的實例—>即創建子類
12 return ModelForm.__new__(cls)
13  
14 #為每個ModelForm具體的類創建clean()方法
15 def clean_init(self):
16 “””
17 :param self: 表單對象
18 :return:
19 “””
20 error_list = [] #存儲錯誤
21 for field in admin_class.readonly_fields:
22 #獲取數據庫的數據
23 field_db = getattr(self.instance, field)
24 #獲取前端數據
25 field_input = self.cleaned_data.get(field)
26 #判斷
27 if field_db != field_input:
28 #觸發錯誤,固定格式
29 error_list.append(
30 ValidationError(
31 ‘Field %(field)s is readonly,data should be %(value)s’,
32 code=’invalid’,
33 params={‘field’: field,’value’: field_db}
34 )
35 )
36 #集中錯誤
37 if error_list:
38 raise ValidationError(error_list)
39  
40 <——————-為對象添加屬性——————————–
41 #為該類添加__new__靜態方法,當調用該類時,會先執行__new__方法,創建對象
42 # 這裏會覆蓋父類的__new__
43 setattr(_model_form_class, ‘__new__’, __new__)
44  
45 #添加clean()方法到生成的表單類
46 setattr(_model_form_class, ‘clean’, clean_init)
47  
48 return _model_form_class
49  

基本的邏輯實現完畢,修改指定的只讀字段

 1 ...
 2 #自定義類,顯示特定字段
 3 class CustomerAdmin(ModelAdmin):
 4     list_display = [id, qq,name,source,consultant,consult_course,date,status]
 5     list_filters = [source,consultant,consult_course,status]
 6     search_fields = [qq, name, consultant__name, ]
 7     ordering = date
 8     # filter_horizontal = [‘tags‘]
 9     readonly_fields = [qq, name] #添加該字段
10     readonly_table = False
11     list_per_page = 2
12 ...

效果如下:

2.3 處理多對多關系

項目一:CRM(客戶關系管理系統)--11