Django—Form两种解决表单数据无法动态刷新的方法
一、无法动态更新数据的实例
# Create your models here. class Classes(models.Model): title=models.CharField(max_length=32) def __str__(self): return self.title class Teacher(models.Model): name=models.CharField(max_length=32) t2c=models.ManyToManyField(Classes) def __str__(self): return self.name
2. views的功能有查看、添加、编辑班级或教师表
class ClsForm(Form): title=fields.RegexField('老男孩',error_messages={'invalid':'请以 老男孩 开头'}) class TchForm(Form): # name=fields.CharField(max_length=16,min_length=2,widget=widgets.TextInput(attrs={'class':'form-control'})) # t2c=fields.MultipleChoiceField( # choices=models.Classes.objects.values_list('id','title'), # widget=widgets.SelectMultiple(attrs={'class':'form-control'}) # ) # class LoginForm(forms.Form): # ... # hobby = forms.fields.MultipleChoiceField( # choices=((1, "篮球"), (2, "足球"), (3, "双色球"),), # label="爱好", # initial=[1, 3], # widget=forms.widgets.CheckboxSelectMultiple() # ) name = fields.CharField(max_length=16, min_length=2, widget=widgets.TextInput(attrs={'class': 'form-control'})) t2c = fields.MultipleChoiceField( choices = models.Classes.objects.values_list('id', 'title'), widget = widgets.SelectMultiple() # widget=widgets.CheckboxSelectMultiple(attrs={'class': 'form-control'}) ) def classes(request): cls_list=models.Classes.objects.all() return render(request,'class/classes.html',{'cls_list':cls_list}) def teachers(request): tch_list = models.Teacher.objects.all() return render(request, 'class/teachers.html', {'tch_list': tch_list}) def add_cls(request): if request.method=='GET': obj=ClsForm() return render(request,'class/add_classes.html',{'obj':obj}) else: obj=ClsForm(request.POST) # print(obj) if obj.is_valid(): models.Classes.objects.create(**obj.cleaned_data) return redirect(reverse('classes')) return render(request,'class/add_classes.html',{'obj':obj}) def add_tch(request): if request.method=="GET": obj=TchForm() return render(request,'class/add_teacher.html',{'obj':obj}) else: obj=TchForm(request.POST) if obj.is_valid(): tc=obj.cleaned_data.pop('t2c') tch_obj=models.Teacher.objects.create(name=obj.cleaned_data['name']) tch_obj.t2c.add(*tc) return redirect(reverse('teacher')) return render(request,'class/add_teacher.html',{'obj':obj}) def edit_class(request,pk): if request.method == 'GET': cls = models.Classes.objects.filter(id=pk).first() obj = ClsForm(initial={'title': cls.title}) return render(request, 'class/edit_classes.html', {'nid': pk, 'obj': obj}) else: obj = ClsForm(request.POST) if obj.is_valid(): models.Classes.objects.filter(id=pk).update(**obj.cleaned_data) return redirect(reverse('classes')) return render(request, 'class/edit_classes.html', {'nid':pk, 'obj': obj}) def edit_tch(request,pk): if request.method=='GET': tch=models.Teacher.objects.filter(id=pk).first() v=tch.t2c.values_list('id') cls_ids = list(zip(*v))[0] if list(zip(*v)) else [] # 格式化为列表类型 obj = TchForm(initial={'name': tch.name, 't2c': cls_ids}) return render(request, 'class/edit_teacher.html', {'nid': pk, 'obj': obj}) else: obj = TchForm(request.POST) if obj.is_valid(): tc = obj.cleaned_data.pop('t2c') # 获取修改后的任课班级id tch_obj = models.Teacher.objects.filter(id=pk).first() tch_obj.name = obj.cleaned_data['name'] # 更新教师姓名方法2 tch_obj.save() tch_obj.t2c.set(tc) return redirect(reverse('teacher')) return render(request,'class/edit_teacher.html',{'nid':pk,'obj':obj}) # models.Teacher.objects.filter(id=nid).update(name=obj.cleaned_data['name']) # 更新教师姓名方法1
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>班级列表</title> <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}"> </head> <body> <div style="width: 700px; margin: 30px auto"> <a class="btn btn-default" href="{% url 'add_cls' %}" style="margin-bottom: 10px">添加班级</a> <table class="table table-hover" border="1" cellspacing="0"> <thead> <tr> <th>ID</th> <th>班级</th> <th>操作</th> </tr> </thead> <tbody> {% for item in cls_list %} <tr> <td>{{ item.id }}</td> <td>{{ item.title }}</td> <td><a href="{% url 'edit_cls' item.pk %}{{item.id }}">编辑</a></td> </tr> {% endfor %} </tbody> </table> </div> </body> </html>
addclass.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加班级</title> </head> <body> <h1>添加班级</h1> <form action="" method="post"> {% csrf_token %} <p> {{ obj.title }} {{ obj.errors.title.0 }} </p> <input type="submit" value="提交"> </form> </body> </html>
edit_class.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>编辑班级</title> </head> <body> <h1>编辑班级</h1> <form action="" method="post"> {% csrf_token %} <p> {{ obj.title }} {{ obj.errors.title.0 }} </p> <input type="submit" value="提交"> </form> </body> </html>
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>教师列表</title> <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}"> </head> <body> <div style="width: 700px; margin: 30px auto"> <a class="btn btn-default" href="{% url 'add_tch' %}" style="margin-bottom: 10px">添加教师</a> <table class="table table-hover" border="1" cellspacing="0"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>任教班级</th> <th>操作</th> </tr> </thead> <tbody> {% for item in tch_list %} <tr> <td>{{ item.id }}</td> <td>{{ item.name }}</td> <td> {% for row in item.t2c.all %} <span style="border: solid gray 1px">{{ row.title }}</span> {% endfor %} </td> <td><a href="{% url 'edit_tch' item.id %}">编辑</a></td> </tr> {% endfor %} </tbody> </table> </div> </body> </html>
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加教师</title> <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}"> </head> <body> <div style="width: 500px; margin: 20px auto"> <h3 style="width: 100px; margin: 10px auto">添加教师</h3> <form class="form-horizontal" action="" 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.t2c }} {{ obj.errors.t2c.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>
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>编辑教师</title> <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}"> </head> <body> <div style="width: 500px; margin: 20px auto"> <h3 style="width: 100px; margin: 10px auto">编辑教师</h3> <form class="form-horizontal" action="" 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.t2c }} {{ obj.errors.t2c.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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现