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

classes.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_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>

teachers.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>

add_teacher.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>

edit_teacher.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>

 

posted @ 2023-04-22 19:19  布衣梦蝶1978  阅读(244)  评论(0编辑  收藏  举报