Django實現增刪改查--使用ModelForm表單

1 創建模型

在models.py中創建模型

class ProductModelForm(forms.ModelForm):

    #單選
    create_userid = forms.ChoiceField(label="創建者")

    class Meta:
        model = Product #對應的model
        fields = "__all__" #model類裏所有的字段都展示
        # fields = ["name","num"] #指定展示某些字段
        exclude = None #除了指定字段,其他字段都展示
        labels = { #定製lable標籤名
            "name" : "產品名稱",
            "num" : "總數量",
            "left" : "剩餘數量",
            "orgprice" : "原價",
            "price" : "現價",
            "create_userid" : "創建者"
        }
        widgets = { #設置每個字段的插件信息
            "name" : forms.widgets.TextInput(attrs={"class":"form-control"}),
            "num" : forms.widgets.NumberInput(attrs={"class":"form-control"}),
            "left" : forms.widgets.NumberInput(attrs={"class":"form-control"}),
            "orgprice": forms.widgets.NumberInput(attrs={"class": "form-control"}),
            "price": forms.widgets.NumberInput(attrs={"class": "form-control"}),
            "create_userid": forms.widgets.Select(attrs={"class": "form-control"})
        }

        error_messages = {  # 設置每個字段的報錯提示信息
            "name": {
                "required": "不能爲空!"
            },
            "num": {
                "required": "不能爲空!"
            },
            "left": {
                "required": "不能爲空!"
            },
            "orgprice": {
                "required": "不能爲空!"
            },
            "price": {
                "required": "不能爲空!"
            },
        }

    def __init__(self, *args, **kwargs):
        """
        :param args:
        :param kwargs:
        自定義一個__init__方法的初始化方法,通過調用父類的__iniy__方法,進行初始化實現動態更新
        """
        super(ProductModelForm, self).__init__(*args, **kwargs)
        
        #從模型中加載選項
        self.fields['create_userid'].choices = User.objects.all().values_list('id', 'name')

2 列表頁面

2.1 頁面視圖

在productviews.py中新建ProductListView

class ProductListView(generic.ListView):
    model = Product
    template_name = 'blog/productlist.html'
    context_object_name = 'list'

    # 篩選字典
    filter_dict = {}
    username = ''
    name = ''

    def get(self, request, *args, **kwargs):
        self.filter_dict = {}
        self.username = request.GET.get("username", None)
        self.set_filter_dict('username', self.username)

        self.name = request.GET.get("name", None)
        self.set_filter_dict('name',self.name)

        return super(ProductListView, self).get(request, *args, **kwargs)

    def set_filter_dict(self,key,value):
        if value is not None and (len(value) > 0):
            self.filter_dict[key] = value

    def get_queryset(self):
        return self.model.objects.filter(**self.filter_dict)

    def get_context_data(self,**kwargs):
        context = super(ProductListView, self).get_context_data(**kwargs)
        context['name'] = self.name
        context['username'] = self.username
        context['title'] = '用戶列表'
        return context

2.2 添加模板

新建模板productlist.html

<html>
     <head>
      <title>
          {{ title }}
      </title>
    </head>

   <body>
      <form action="#">
            <div class="input-group">
                <p>
                    商品名稱:
                    {% if name %}
                        <input type="text" class="form-control" placeholder="用戶名" name="name" value="{{ name }}">
                    {% else %}
                        <input type="text" class="form-control" placeholder="" name="name">
                    {% endif %}

                    <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">搜索</button>
                    </span>

                    <a href="{% url 'productadd' %}" class="btn btn-primary btn-sm"
                           data-toggle="modal"
                           data-target="#Modal">增加</a>
                </p>

            </div>
        </form>


        <table border="1px ">
              <thead>
                <tr>
                  <th>id</th>
                  <th>商品名稱</th>
                  <th>總數量</th>
                  <th>剩餘數量</th>
                    <th>原價格</th>
                  <th>現價</th>
                    <th>創建者</th>
                  <th>操作</th>
                </tr>
            </thead>
            {% if list %}
                     <tbody>
                    {% for item in list %}
                        <tr>
                             <td>
                                 {{ item.id }}
                             </td>
                             <td>
                                 {{ item.name }}
                             </td>
                             <td>
                                 {{ item.num }}
                             </td>
                             <td>
                                 {{ item.left }}
                             </td>
                             <td>
                                 {{ item.orgprice }}
                             </td>
                             <td>
                                 {{ item.price }}
                             </td>
                            <td>
                                 {{ item.create_userid }}
                             </td>
                             <td>
                                 <a href="/blog/productedit?id={{ item.id }}" class="btn btn-primary btn-sm"
                                       data-toggle="modal"
                                       data-target="#Modal">修改</a>

                                  <a href="javascript:void(0)" onclick="itemDelete({{ item.id }})" class="btn btn-primary btn-sm"
                                       data-toggle="modal"
                                       data-target="#Modal">刪除</a>
                             </td>
                        </tr>
                    {% endfor %}
                    </tbody>
            {% endif %}
        </table>

   </body>
</html>
<script>
    function itemDelete(id){
        var truthBeTold = window.confirm("確定要刪除" + id + "?");
        if (truthBeTold) {
            location.href = "/blog/productdelete?id=" + id;
        }
    }

</script>





2.3 添加URL匹配

在urls.py中添加

url(r'^productlist/', productviews.ProductListView.as_view(), name='productlist'),

2.4 查看頁面

在這裏插入圖片描述

3 添加頁面

3.1 添加視圖

在productviews.py中新建ProductAddView

class ProductAddView(View):

    def get(self, request, *args, **kwargs):
        title = '添加商品'
        form = ProductModelForm()
        return render(request, 'blog/productform.html',locals())

    def post(self, request, *args, **kwargs):
        title = '添加商品'
        form = ProductModelForm(request.POST)  # 綁定數據的form表單

        if form.is_valid():
            form.save()
            #跳轉到列表
            return HttpResponseRedirect(reverse('productlist'))
        return render(request, 'blog/productform.html', locals())

3.2 添加模板

添加模板productform.html

<html>
     <head>
      <title>
          {{ title }}
      </title>
    </head>

     <body>
        <form action="" method="post">
                {% csrf_token %}
                <p>{{ form.name.label }}
                    {{ form.name }} <span>{{ form.name.errors.0 }}</span>
                </p>
                <p>{{ form.num.label }}
                    {{ form.num }} <span>{{ form.num.errors.0 }}</span>
                </p>
                <p>{{ form.left.label }}
                    {{ form.left }} <span>{{ form.left.errors.0 }}</span>
                </p>
                <p>{{ form.orgprice.label }}
                    {{ form.orgprice }} <span>{{ form.orgprice.errors.0 }}</span>
                </p>
                <p>{{ form.price.label }}
                    {{ form.price }} <span>{{ form.price.errors.0 }}</span>
                </p>
                <p>{{ form.create_userid.label }}
                    {{ form.create_userid }} <span>{{ form.create_userid.errors.0 }}</span>
                </p>
                <input type="submit">
         </form>

     </body>
</html>

3.3 添加URL匹配

在urls.py中添加

 url(r'^productadd/', productviews.ProductAddView.as_view(), name='productadd'),

3.4 亂碼

如果表單裏面使用了ModelMultipleChoiceField,ModelChoiceField,出現了亂碼, 可以加入下面代碼解決

import sys

reload(sys)
sys.setdefaultencoding('utf-8')

3.5 查看

在這裏插入圖片描述

4 修改頁面

4.1 修改視圖

在productviews.py中添加ProductEditView

class ProductEditView(View):

    def get(self, request, *args, **kwargs):
        title = '修改商品'
        id = request.GET.get("id", None)
        product_obj = Product.objects.filter(id=id).first()
        form = ProductModelForm(instance=product_obj)
        return render(request, 'blog/productform.html',locals())

    def post(self, request, *args, **kwargs):
        title = '修改商品'
        id = request.GET.get("id", None)
        product_obj = Product.objects.filter(id=id).first()
        form = ProductModelForm(request.POST,instance=product_obj)
        if form.is_valid():
            form.save()
            #跳轉到列表
            return HttpResponseRedirect(reverse('productlist'))
        return render(request, 'blog/productform.html', locals())

4.2修改模板

可以和3.2公用模板productform.html

4.3 URL匹配

在urls.py中添加

 url(r'^productedit/', productviews.ProductEditView.as_view(), name='productedit'),

4.4 查看

在這裏插入圖片描述

5 刪除

5.1 刪除視圖

在productviews.py中添加ProductDeleteView

class ProductDeleteView(View):

    def get(self, request, *args, **kwargs):

        id = request.GET.get("id", None)
        product = Product.objects.filter(id=id).first()
        product.delete()
        return HttpResponseRedirect(reverse('productlist'))

5.2 URL匹配

在urls.py中添加

 url(r'^productdelete/', productviews.ProductDeleteView.as_view(), name='productdelete'),

5.3 刪除頁面

在這裏插入圖片描述

技術交流

CleverCode是一名架構師,技術交流,諮詢問題,請加CleverCode創建的qq羣(架構師俱樂部):517133582。加羣和騰訊,阿里,百度,新浪等公司的架構師交流。【架構師俱樂部】宗旨:幫助你成長爲架構師!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章