[oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库

1 form表单如何生成多选框(包含了多选框可选择内容)

    - Form设置班级输入框为 select多选
        - 多选
            class TeacherForm(Form):
                name = fields.CharField(max_length=16,
                                        widget=widgets.TextInput(attrs={‘class‘: ‘form-control‘})
                                        )
                cls = fields.MultipleChoiceField(
                    choices=models.Classes.objects.values_list(‘id‘, ‘title‘),
                    widget=widgets.SelectMultiple(attrs={‘class‘: ‘form-control‘})
                )

2 上面存在bug:刷新页面无法动态刷新数据库数据

# BUG:页面刷新时,无法动态显示数据库内容
    分别打开添加老师(或者学生)的页面,和添加班级的页面, 然后再添加班级页面新添加一个班级。
    刷选添加老师(或者学生)页面,发现班级下拉框并没有动态增加刚才新增加的班级。

    原因分析:出现在class TeacherForm和StudentForm定义上,以TeacherForm为例
    class TeacherForm(Form):
        name = fields.CharField(max_length=16,
                                widget=widgets.TextInput(attrs={‘class‘: ‘form-control‘})
                                )
        cls = fields.MultipleChoiceField(
            choices=models.Classes.objects.values_list(‘id‘, ‘title‘),
            widget=widgets.SelectMultiple(attrs={‘class‘: ‘form-control‘})
        )

    在实例化一个TeacherForm对象时,由于name, cls为类变量,所以这两个类变量只要第一次生成后,
    后面实例化对象时,这两个变量是不会改变的。
    在调用父类init函数时,会将cls, name放到父类的self.fields里面
    self.fields = {‘name‘: name, ‘cls‘: cls}

    因此解决办法出来了,在每一次实例化对象时,再获取数据库的值给cls,
    重新刷新self.fields里面的cls字段内容
    class TeacherForm(Form):
        name = fields.CharField(max_length=16,
                                widget=widgets.TextInput(attrs={‘class‘: ‘form-control‘})
                                )
        cls = fields.MultipleChoiceField(
            choices=models.Classes.objects.values_list(‘id‘, ‘title‘),
            # 多选这个可不能删,因为下面的init修改的不是这里
            widget=widgets.SelectMultiple(attrs={‘class‘: ‘form-control‘})
        )

        def __init__(self, *args, **kwargs):
            super(TeacherForm, self).__init__(*args, **kwargs)
            self.fields[‘cls‘].widget.choices = models.Classes.objects.values_list(‘id‘, ‘title‘)

3 多选框的内容如何插入数据库

        obj = TeacherForm(request.POST)
        if obj.is_valid():
            print(obj.cleaned_data)
            # 多对多关系插入数据库,主要是插入teacher表,和第三张表
            class_list = obj.cleaned_data.pop(‘cls‘)
            print(class_list)
            teacher = models.Teacher.objects.create(**obj.cleaned_data)
            teacher.cls.add(*class_list)

4 多选框的默认显示

  initial中的多选框key的value必须是列表

def edit_teacher(request, nid):
    if request.method == "GET":
        row = models.Teacher.objects.filter(id=nid).first()
        class_ids = row.cls.values_list(‘id‘)
        class_id_list = list(zip(*class_ids))[0] if list(zip(*class_ids)) else []
        obj = TeacherForm(initial={‘name‘: row.name, ‘cls‘: class_id_list})
        # obj = TeacherForm(initial={‘name‘: row.name, ‘cls‘: [1,2]})
        return render(request, ‘app01_edit_teacher.html‘, {‘obj‘: obj, ‘nid‘: nid})

5 多选框数据更改到数据库

        obj = TeacherForm(request.POST)
        if obj.is_valid():
            print(obj.cleaned_data)
            models.Teacher.objects.filter(id=nid).update(name=obj.cleaned_data[‘name‘])
            teacher  = models.Teacher.objects.filter(id=nid).first()
            teacher.cls.set(obj.cleaned_data[‘cls‘])

6 老师管理
6.1 查看老师列表

6.1.1 前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
    <link rel="stylesheet" href="/static/plugins/font-awesome-4.7.0/css/font-awesome.css">
</head>
<body>
<h4>老师管理</h4>
<p>
    <a href="/app01/add_teacher" class="btn btn-primary">添加</a>
</p>
<table class="table table-striped table-bordered table-hover table-condensed">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>班级</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for item in teacher_list %}
        <tr>
            <td>{{ item.id }}</td>
            <td>{{ item.name }}</td>
            <td>
                {% for x in item.cls.values_list %}
                    {{ x.1}}
                {% endfor %}
            </td>
            <td>
                <a href="/app01/edit_teacher/nid={{ item.id }}" class="glyphicon glyphicon-pencil">编辑</a>|
                <a href="/app01/del_teacher/nid={{ item.id }}" class="glyphicon glyphicon-trash">删除</a>
            </td>
            {#点击删除是一个get请求,要想告诉服务器id,可以通过url get请求获取,或者url匹配到传递给视图#}
        </tr>
    {% endfor %}

    </tbody>
</table>
<nav aria-label="Page navigation">
    <ul class="pagination">
        {{ page_info.pager|safe }}
    </ul>
</nav>
</body>
</html>

6.1.2 视图

def teachers(request):
    teacher_list = models.Teacher.objects.all()
    return render(request, ‘app01_teacher_list.html‘, {‘teacher_list‘: teacher_list})

6.2 增加老师

6.2.1 前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
    <link rel="stylesheet" href="/static/plugins/font-awesome-4.7.0/css/font-awesome.css">
</head>
<body>
<div style="width:500px;margin:0 auto">
    <h4 style="margin-left: 25px;">添加老师</h4>
    <form class="form-horizontal" action="/app01/add_teacher" method="POST">
        {% csrf_token %}
        <div class="form-group">
            <label class="col-sm-2 control-label">姓名:</label>
            <div class="col-sm-10">
                {{ obj.name }}{{ obj.errors.name.0 }}
            </div>
        </div>

        <div class="form-group">
            <label class="col-sm-2 control-label">班级:</label>
            <div class="col-sm-10">
                {{ obj.cls }} {{ obj.errors.cls.0 }}
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <input type="submit" class="btn btn-default" value="提交"/>
            </div>
        </div>
    </form>
</div>

</body>
</html>

6.2.2 视图

def add_teacher(request):
    if request.method == "GET":
        obj = TeacherForm()
        return render(request, ‘app01_add_teacher.html‘, {‘obj‘: obj})
    else:
        obj = TeacherForm(request.POST)
        if obj.is_valid():
            print(obj.cleaned_data)
            # 多对多关系插入数据库,主要是插入teacher表,和第三张表
            class_list = obj.cleaned_data.pop(‘cls‘)
            print(class_list)
            teacher = models.Teacher.objects.create(**obj.cleaned_data)
            teacher.cls.add(*class_list)
            return redirect(‘/app01/teachers‘)
        else:
            print(‘POST=‘, request.POST)
            print(‘errors=‘, obj.errors)
            return render(request, ‘app01_teacher_list.html‘, {‘obj‘: obj})

6.3 编辑老师

6.3.1 前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/app01/edit_teacher/nid={{ nid }}" method="POST">
    {% csrf_token %}
    {{ obj.name }}
    {{ obj.cls }}
    <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

6.3.2 视图

def edit_teacher(request, nid):
    if request.method == "GET":
        row = models.Teacher.objects.filter(id=nid).first()
        class_ids = row.cls.values_list(‘id‘)
        class_id_list = list(zip(*class_ids))[0] if list(zip(*class_ids)) else []
        obj = TeacherForm(initial={‘name‘: row.name, ‘cls‘: class_id_list})
        # obj = TeacherForm(initial={‘name‘: row.name, ‘cls‘: [1,2]})
        return render(request, ‘app01_edit_teacher.html‘, {‘obj‘: obj, ‘nid‘: nid})
    else:
        print(‘hello‘)
        obj = TeacherForm(request.POST)
        if obj.is_valid():
            print(obj.cleaned_data)
            models.Teacher.objects.filter(id=nid).update(name=obj.cleaned_data[‘name‘])
            teacher  = models.Teacher.objects.filter(id=nid).first()
            teacher.cls.set(obj.cleaned_data[‘cls‘])
            return redirect(‘/app01/teachers‘)
        else:
            return render(request, ‘app01_edit_teacher.html‘, {‘obj‘: obj, ‘nid‘: nid})

时间: 2024-10-10 06:02:20

[oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库的相关文章

django系列9--django中的组件(form表单)

一.Form介绍 普通方式注册功能实现 views.py # 注册 def register(request): error_msg = "" if request.method == "POST": username = request.POST.get("name") pwd = request.POST.get("pwd") # 对注册信息做校验 if len(username) < 6: # 用户长度小于6位 e

Django 之 form表单

Django中的Form表单 1.背景 平时我们在书写form表单时,经常都是手动的去写一些input标签,让用户输入一些功能,进行一些校验的判断,等等.Django中的form表单就能够帮我们去实现这些功能,比较便捷. 2.Django form表单的功能 1.生成页面可执行的HTML标签 2.对应户的数据进行校验 3.保留上次输入的内容 3.先用普通方式手写一个注册功能 1.views.py文件中 # 注册 def register(request): error_msg = ""

Django中Form表单之字段详解

Django中的Form表单 1.背景 平时我们在书写form表单时,经常都是手动的去写一些input标签,让用户输入一些功能,进行一些校验的判断,等等.Django中的form表单就能够帮我们去实现这些功能,比较便捷. 2.Django form表单的功能 1.生成页面可执行的HTML标签 2.对应户的数据进行校验 3.保留上次输入的内容 3.先用普通方式手写一个注册功能 1.views.py文件中 # 注册 def register(request): error_msg = ""

Django之form表单操作

小白必会三板斧 from django.shortcuts import render,HttpResponse,redirect HttpRespone:返回字符串 render:返回html页面 redirect:重定向 静态文件配置 静态文件:网站所用到的,自己写好js,自己写好css,第三方的框架bootstrap fontwesome sweetalert 通常情况下网站所用到的静态文件资源统一都放在static文件下 STATIC_URL='/static' 是访问静态资源的接口前缀

python_Django 实现登入功能form表单的参数接收处理

1.创建Django工程. 参考https://www.cnblogs.com/CK85/p/10159159.html中步骤. 2.在urls.py文件中添加url分发路径 """Django_test URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/top

jquery form表单序列化

一.serialize() 作用 serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. 语法 $(selector).serialize(): 比如 $("button").click(function(){ $("div").text($("form").serialize()); }); 二.注意点 不能序列化file文件类型的input,只适用于一些常用的类型例如text.checkbox.select.date等.

django,form表单,数据库增删改查

Django 02 复习:  Django下载:   在命令行输入:    pip3 install django==1.11.11    在这里不要用最新的3.7,推荐使用3.6/3.5/3.4    判断下载成功:     django-admin    创建django项目:     django-admin startproject 项目名     会创建跟项目同名的文件夹     settings.py 暴露给用户可配置的配置文件     urls.py     路由与视图函数对应文件

Django--分页器(paginator)、Django的用户认证、Django的FORM表单

分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Paginator(objects, 2) >>> p.count #数据总数 4 >>> p.num_pages #总页数 2 >>> type(p.page

# Django admin、form表单的应用记录

目录 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 form组件使用 1. form的作用 2. form组件生成HTMKL代码 3. form组件校验数据有效性 3. form组件如何给html标签设置默认值 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 1. 创建超级用户 python manage.py createsuperuser username: wph password: 1231