小白的学习之路,自己的理解,如有偏差,还望指正!记录笔记也愿为困惑的你,贡献一份小小的力量。希望大家都可以成为大神,共同进步~~
一.增加数据
1.添加路由
path('**/index/', rental.index, name="rental_index"),
path("***/add/",rental.add,name='rental_add'),
path('***/<int:nid>/del/', rental.del_msg, name="rent_rental_del"),
path('***/<int:nid>/edit/', rental.eidt, name="rent_rental_edit"),
2.在 view.py 视图中到导入:from django.forms import ModelForm
from django.forms import ModelForm
class RentalModelForm(ModelForm):
class Meta:
model = Money # 对应的是你要操作的数据库(一定别忘了导入这个表哦)
fields =["house_number","room_num","rent_time","water_content","kwh",] #对应的表中的字段,可选择性展示
exclude = None #排除的字段
labels = None #提示信息
help_texts = None #帮助提示信息
error_messages = None #自定义错误信息
#error_messages用法:
error_messages = {
'house_number':{'required':"不能为空",},
'room_num':{'required':"不能为空",},
}
def __init__(self,*args,**kwargs):
super().__init__(*args, **kwargs)
#name: 列表中字段名字可以根据name判断添加与否,field:列表中字段的对象room_price <django.forms.fields.DecimalField object at 0x00000201CC5BFF10>
for name,field in self.fields.items():
field.widget.attrs={"class":"form-control"} # 自定义插件,添加样式属性
__________________________________________________________________________
1. 字段fields的选择:
。全部字段:fields = "__all__"
。部分字段:fields =[["house_number","room_num","rent_time"]](列表中显示需要展示的字段名)
。排除字段:exclude = ["title"](某一个字段的名称)
2.error_messages
。可以不同单独设置,默认会根据数据库设计表的时候,是否为空来判断
_____________________________________________________________________________
# 列表
def index(request):
contact_list= Money.objects.all()
paginator = Paginator(contact_list, 20)
# 用户点击的当前页(页码)
page_number = request.GET.get("page") # 在浏览器内获取页码
page_obj = paginator.get_page(page_number)
return render(request, '****/index.html',{"page_obj": page_obj})
_________________________________________________________________________________
# 添加
def add(request):
if request.method =="GET": //get请求返回页面表单+输入框
form= UserModelForm()
return render(request, '****/add.html',{"form":form}) //引号内是前端页面的展示模板
form= UserModelForm(data= request.POST) //获取post数据
if form.is_valid(): // 检验前端获取字段和数据库内字段是否一致(默认是否为空):True print(form.cleaned_data)打印验证信息
form.save() // 存储数据
return redirect("/***/userlist/") //返回列表页
//form.errors 返回失败信息
return render(request, '***/add.html',{"form":form}) //如果有空数据,就会附带一个错误信息返回页面{{field.errors.0}}
________________________________________________________________________________
1.如果对获取的前端数据需要进行处理:
f=form.save(commit=False) //暂存,未提交
f.water_content=ww // 处理字段,我这边是变量赋值的,也可以在这里加一些运算
f.save() // 提交
2.如果用户的输入并非是数据库内全部字段的值,额外增加的字段(例如:为排除的字段添加值)
form.instance.字段名=值
f.save() // 提交
_______________________________________________________________________________
# 删除
def del_msg(request,nid):
room_msg =Money.objects.filter(id=nid).delete()
return redirect("/***/index/")
________________________________________________________________________________
# 编辑
def edit(request,id):
room_msg =Room.objects.filter(pk=id).first()
if request.method=="GET":
form= RoomModelForm(instance=room_msg)
return render(request,'****/edit.html',{"form":form})
form= RoomModelForm(data= request.POST,instance=room_msg)
if form.is_valid():
form.save()
return redirect("/***/index/")
return render(request, '****/add.html',{"form":form})
3.html页面
----index.html 删除按钮-----
<div class="box-body table-responsive no-padding">
<table class="table table-hover">
<tr>
<th>ID</th>
<th>户号</th>
<th>房间号</th>
<th>记录时间</th>
<th>水费</th>
<th>电费</th>
<th>房租</th>
<th>其他</th>
<th>总计</th>
<th>操作</th>
</tr>
{% for page_obj in page_obj %}
<tr>
<td>{{ page_obj.id }}</td>
<td>{{ page_obj.house_number }}</td>
<td>{{ page_obj.room_num }}</td>
<td>{{ page_obj.rent_time }}</td>
<td>{{ page_obj.water_content }}</td>
<td>{{ page_obj.kwh }}</td>
<td>{{ page_obj.room_price }}</td>
<td>{{ page_obj.other}}</td>
<td>{{ page_obj.total }}</td>
<td><a href="/rental/{{ page_obj.id}}/del">删除</a></td> <!-- 没有页面,访问当前地址,返回列表 -->
<td><a href="/rental/{{ page_obj.id}}/edit">编辑</a></td>
</tr>
{% endfor %}
</table>
</div>
<div class="box-footer clearfix">
<a role="button" href="{% url 'rental_add' %}" class="btn btn-primary">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 添加月收租</a>
<ul class="pagination pagination-sm no-margin pull-right"><!-- 页面的页码 -->
{% if page_obj.has_previous %}
<li><a href="?page={{ page_obj.previous_page_number }}">«</a></li><!--get请求当前地址,通过页码获取数据 -->
{% endif %}
<li class="current">{{ page_obj.number }}</li>
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}">»</a></li>
{% endif %}
</ul>
</div>
</div>
___________________________________________________________________
----add.html-----
<form class="form-horizontal" action="#" method="post" novalidate>
{% csrf_token %}
<div class="box-body">
{% for field in form %}
<div class="form-group">
<label class="col-sm-2 control-label">{{field.label}} :</label> <!--label来自你为字段添加的verbose_name,如果设置的话,这里会直接显示字段名了 -->
<div class="col-sm-4">{{field}}</div> <!-- 这里就是input框的显示了 -->
<span style="color: brown;">{{field.errors.0}}</span> <!-- 如果在函数中校验失败,这里显示错误信息 -->
</div>
{% endfor %}
</div>
<div class="box-footer">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
_______________________________________________________________
-----edit.html-----
<form class="form-horizontal" action="#" method="post">
{% csrf_token %}
<div class="box-body">
{% for field in form %}
<div class="form-group">
<label class="col-sm-2 control-label">{{field.label}} :</label>
<div class="col-sm-4">{{field}}</div>
<span style="color: brown;">{{field.errors.0}}</span>
</div>
{% endfor %}
</div>
<!-- /.box-body -->
<div class="box-footer">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">提交</button>
<button type="submit" class="btn btn-default">返回</button>
</div>