Bootstrap

【Django】表单FormModel处理之增删改查

小白的学习之路,自己的理解,如有偏差,还望指正!记录笔记也愿为困惑的你,贡献一份小小的力量。希望大家都可以成为大神,共同进步~~

表单FormModel处理之处理数据

一.增加数据

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 }}">&laquo;</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 }}">&raquo;</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> &nbsp;
                  <button type="submit" class="btn btn-default">返回</button>
              </div>
;