Django技术问询:如何录入网页列表信息(如填写学员成绩单)
实现可录入的学员成绩单表格(Django方案)
1. 定义模型与表单类
先创建学员模型,再基于模型生成表单(支持批量处理的表单集):
# models.py from django.db import models class Student(models.Model): name = models.CharField(max_length=100) mark = models.IntegerField()
# forms.py from django import forms from django.forms import formset_factory from .models import Student class StudentMarkForm(forms.ModelForm): class Meta: model = Student fields = ['name', 'mark'] widgets = { 'name': forms.TextInput(attrs={'readonly': 'readonly'}), # 锁定姓名不可修改 'mark': forms.NumberInput(attrs={'min': 0, 'max': 100}) } # 生成批量处理的表单集 StudentMarkFormSet = formset_factory(StudentMarkForm, extra=0)
2. 视图层处理数据交互
在视图中获取现有学员数据,初始化表单集,并处理提交后的保存逻辑:
# views.py from django.shortcuts import render from .models import Student from .forms import StudentMarkFormSet def edit_marks(request): students = Student.objects.all() if request.method == 'POST': formset = StudentMarkFormSet(request.POST) if formset.is_valid(): for form in formset: if form.has_changed(): form.save() return render(request, 'marks_edit.html', {'formset': formset, 'success': True}) else: # 用已有学员数据初始化表单集 formset = StudentMarkFormSet(initial=[ {'name': s.name, 'mark': s.mark, 'id': s.id} for s in students ]) return render(request, 'marks_edit.html', {'formset': formset})
3. 模板层自定义表格结构
放弃form.as_table,手动编写HTML结构匹配你现有的样式类:
<!-- marks_edit.html --> <form method="post"> {% csrf_token %} {{ formset.management_form }} <div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>Name</th> <th>Mark</th> </tr> </thead> <tbody> {% for form in formset %} <tr> {{ form.id }} <!-- 隐藏字段,用于定位要更新的学员 --> <td>{{ form.name }}</td> <td>{{ form.mark }}</td> </tr> {% endfor %} </tbody> </table> </div> <button type="submit">保存成绩</button> {% if success %} <p>成绩已成功更新!</p> {% endif %} </form>
核心说明
form.as_table会生成Django默认的表格结构,无法直接适配你现有的s-table-container和s-table样式,手动编写HTML能完全控制页面结构与样式匹配度。- 表单集用于批量处理多条学员数据,
management_form是表单集必需的控制字段,用来管理表单数量与标识。
内容的提问来源于stack exchange,提问作者Isiko Nicholas
相关产品推荐
相关产品推荐

