項目一:CRM(客戶關系管理系統)--11
阿新 • • 發佈:2017-12-24
簡單的 table object pen source 單獨 content lis clas
接著搞起爛攤子。
前面我們簡單的實現了全篇只讀限制,但是存在安全隱患。在解決此隱患之前,我們需要先之道如何實現自定義後臺表單的驗證。
1. 原生admin中自定義表單驗證
說起表單驗證,在前面提過Form
和MoldeForm
的相關使用,這裏我們要通過另一個方法進行處理。
我們通過使用clean()
方法實現對全部字段進行驗證操作,clean_name()
單獨對每個字段進行驗證處理,其中name
對應字段名稱(必須保持一致)。
這些實際的使用方式就不具體介紹了,簡單的介紹一下實現原理:
實際的代碼中,我們只需要在定義的From
文件中添加即可:
1 from django importforms 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