原创

Django-ModelForm使用-示例

结构

# 当前示例目录结构

A1

    --parts

        --models.py

        --Parts_ModelForm.py

        --views.py

一、创建models(models.py)

# 举例

# verbose_name参数一定要带着,渲染表单时使用

1、配件分类表

class Parts_Classification(models.Model):
name = models.CharField(max_length=32, verbose_name="名称")
other = models.TextField(default="", verbose_name="备注")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updatatime = models.DateTimeField(auto_now=True, verbose_name="更新时间")
is_del = models.BooleanField(default=False)

def __str__(self):
return self.name

2、配件表

class Parts(models.Model):
name = models.CharField(max_length=32, verbose_name="名称")
parts_model = models.CharField(max_length=32, verbose_name="型号")
cost = models.FloatField(default=0.00, verbose_name="成本价格()")
price = models.FloatField(default=1.00, verbose_name="销售价格()")
profit = models.FloatField(default=0.00, verbose_name="利润()")
parts_classification = models.ForeignKey(Parts_Classification, on_delete=models.CASCADE, verbose_name="所属分类")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updatatime = models.DateTimeField(auto_now=True, verbose_name="更新时间")
is_del = models.BooleanField(default=False)

def __str__(self):
return self.name


二、创建ModelForm(Parts_ModelForm.py)

from django import forms
from A1.parts.models import *

class Parts_Class_ModelForm(forms.ModelForm):
class Meta:
# 表名
model = Parts_Classification
# 渲染所有字段
fields = "__all__"
# 表单不渲染的字段
exclude = ["create_time", "updatatime", "is_del"]
# 自定义表单
widgets = {
"name": forms.TextInput(attrs={"class": "form-control is-invalid"}),
"other": forms.Textarea(attrs={"class": "form-control"}),
}
# 返回错误信息
error_messages = {
"name": {"max_length": "名称最长32", "required": "名称不能为空"}}


class PartsModelForm(forms.ModelForm):
class Meta:
model = Parts
fields = "__all__"
exclude = ["create_time", "updatatime", "is_del", "profit"]
widgets = {
"name": forms.TextInput(attrs={"class": "form-control is-invalid"}),
"parts_model": forms.TextInput(attrs={"class": "form-control"}),
"cost": forms.NumberInput(attrs={"class": "form-control"}),
"price": forms.NumberInput(attrs={"class": "form-control"}),

"parts_classification": forms.Select(attrs={"class": "custom-select"}),
}
error_messages = {
"name": {"max_length": "名称最长32", "required": "名称不能为空"},
"parts_model": {"max_length": "型号最长32", "required": "型号不能为空"},
"cost": {"required": "成本价格不能为空", 'invalid': "成本价格是数字"},
"price": {"required": "销售价格不能为空", 'invalid': "销售价格是数字"},
"parts_classification": {"required": "分类不能为空"}
}


三、创建视图(views.py)

#引入一下两个模块,其他的按需引入

from django.views.generic.base import TemplateView
from A1.parts.Parts_ModelForm import *
# 添加配件分类
class Parts_Class_Add(LoginRequiredMixin, TemplateView):
def get(self, request, *args, **kwargs):
# 跳转URL
d_url = request.GET.get("d_url")
form = Parts_Class_ModelForm()
return render(request, "add_edit.html", locals())

def post(self, request):
form = Parts_Class_ModelForm(request.POST)
if form.is_valid():
form.save()
res = {"status": True, "msg": "已提交保存"}
else:
res = {"status": False, "msg": json.loads(form.errors.as_json())}
return HttpResponse(json.dumps(res))
class Parts_Add(LoginRequiredMixin, TemplateView):
def get(self, request, *args, **kwargs):
d_url = request.GET.get("d_url")
form = PartsModelForm()
return render(request, "add_edit.html", locals())

def post(self, request, *args, **kwargs):
form = PartsModelForm(request.POST)
if form.is_valid():
form.save()
res = {"status": True, "msg": "已提交保存"}
else:
res = {"status": False, "msg": json.loads(form.errors.as_json())}
return HttpResponse(json.dumps(res))

四、模板创建(add_edit.html)

#仅展示form标签内容和提交方法

<form class="was-validated" action="#" method="post" enctype="multipart/form-data"
onsubmit="return false;">
<div class="form-group">
{{ form }}
</div>
<button type="submit" id="save_bt" class="btn btn-primary">提交保存</button>
</form>

#ajax提交数据,和返回错误信息渲染

$("#save_bt").click(function () {
var datas = {};
var t = $('form').serializeArray();
$.each(t, function () {
datas[this.name] = this.value;
})
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}'}
});

$.ajax({
url: "",
type: "post",
data: datas,
success: function (data) {
var data = JSON.parse(data);


if (data.status) {
tc(data.msg, "success", "mdi mdi-check-bold")
setTimeout(function () {
location.href = "{{ d_url }}";
}, 1000)
} else {
for (var x in data.msg) {
//渲染返回信息函数,看心情写就行
tc(data.msg[x][0]["message"], "danger", "mdi mdi-alert")
}
}
}
})
})



如有问题,请多多指教!!!


正文到此结束
评论

登录后才能发表评论 登录/注册

0评论
  • 还没有评论,快来抢沙发吧!