1. 程式人生 > >模擬admin組件自己開發stark組件之增刪改查

模擬admin組件自己開發stark組件之增刪改查

.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組件之增刪改查