模擬admin組件自己開發stark組件之增刪改查
阿新 • • 發佈:2018-01-31
.html del delet inpu render .site itl filter ext
增刪改查,針對視圖
我們需要modelform來創建,可自動生成標簽,我們還要考慮用戶是不是自己定制,依然解決方法是,繼承和重寫
app01下的joker.py文件
class BookModelForm(ModelForm): class Meta: model = models.Book fields = "__all__" error_messages={ "title":{"required":"該字段不能為空"} } widgets={ "pub_date":widgets.TextInput(attrs={"type":"date"}), } class bookjoker(joker.ModelAdmin): # 自定義樣式類 list_display = (‘id‘,‘title‘,) model_form_class = BookModelForm # 自己定制 form joker.site.register(models.Book,bookjoker)
樣式類中判斷類屬性有沒有用戶自定義,沒有就用自己的
model_form_class = None def get_model_form_class(self):if self.model_form_class: # 如果用戶自己寫了form,就走這裏 return self.model_form_class else: # 用戶沒有自己創建form,那麽我們執行默認的 from django.forms import ModelForm class model_form_class(ModelForm): # 我自己定義的驗證,返回了地址 class Meta: model = self.model fields= ‘__all__‘ return model_form_class #===========================================增刪改查視圖 def add_view(self, request): # 基於form添加表單,需要判斷輸入情況了 model_form_class = self.get_model_form_class() if request.method == ‘GET‘: form = model_form_class() # 實例化這個modelform驗證 return render(request,‘joker/add_view.html‘,locals()) else: form = model_form_class(request.POST) # 傳來的是數據 if form.is_valid(): # 驗證通過 form.save() # 加入數據庫保存 return redirect(self.get_list_url()) # 返回查看頁 else: return render(request,‘joker/add_view.html‘,locals()) # 報錯頁面
def delete_view(self,request,id): if request.method==‘GET‘: return render(request,‘joker/delete_view.html‘) # 刪除頁面,給予提示刪除 else: self.model.objects.filter(pk=id).delete() # 刪除數據 return redirect(self.get_list_url()) def change_view(self,request,id): edit_obj = self.model.objects.filter(pk=id).first() # 拿到修改對象 if not edit_obj: # 因為有可能用戶在url上手動輸入錯誤 return redirect(self.get_list_url()) model_form_class = self.get_model_form_class() # if request.method == ‘GET‘: form = model_form_class(instance=edit_obj) # 初始化數據 return render(request,‘joker/change_view.html‘,locals()) else: form = model_form_class(request.POST,instance=edit_obj) # 針對誰做更新操作 if form.is_valid(): # 驗證通過 form.save() # 更新 return redirect(self.get_list_url())
到這裏主要效果實現:
我們來看下一些需要註意的地方
model_name = model._meta.model_name # 應用名稱 app_label = model._meta.app_label # 表名 ###### 字符串,肯定就是字段了,例如 title字段到這裏,就會得到verbose_name名字,如果沒有verbose_name那就是本身名稱 verbox_name = self.model._meta.get_field(field_name).verbose_name
field.label # 這是form裏面,如果傳來是對象,.label打印數據庫字段,如果有verbose_name打印這個值
field.errors.0 # 錯誤信息
模擬admin組件自己開發stark組件之增刪改查