文章目錄
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。加羣和騰訊,阿里,百度,新浪等公司的架構師交流。【架構師俱樂部】宗旨:幫助你成長爲架構師!