• Django 使用 modelformset 组件批量修改表单数据


    1.models.py:
    class StudentStudyRecord(models.Model):
    '''
    学生学习记录
    '''
    student = models.ForeignKey(verbose_name="学员", to='Student',on_delete=models.CASCADE)
    classstudyrecord = models.ForeignKey(verbose_name="第几天课程", to="ClassStudyRecord",on_delete=models.CASCADE)
    record_choices = (('checked', "已签到"),
    ('vacate', "请假"),
    ('late', "迟到"),
    ('noshow', "缺勤"),
    ('leave_early', "早退"),
    )
    record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
    score_choices = ((100, 'A+'),
    (90, 'A'),
    (85, 'B+'),
    (80, 'B'),
    (70, 'B-'),
    (60, 'C+'),
    (50, 'C'),
    (40, 'C-'),
    (0, ' D'),
    (-1, 'N/A'),
    (-100, 'COPY'),
    (-1000, 'FAIL'),
    )
    score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
    homework_note = models.CharField(verbose_name='作业评语', max_length=255, blank=True, null=True)
    note = models.CharField(verbose_name="备注", max_length=255, blank=True, null=True)

    homework = models.FileField(verbose_name='作业文件', blank=True, null=True, default=None)
    stu_memo = models.TextField(verbose_name='学员备注', blank=True, null=True)
    date = models.DateTimeField(verbose_name='提交作业日期', auto_now_add=True)

    def __str__(self):
    return "{0}-{1}".format(self.classstudyrecord, self.student)

    class Meta:
    unique_together=["student","classstudyrecord"]

    2.views.py
    from django.forms import modelform
    #对学生记录表建立一个modelform
    class StudentStudyRecordForm(forms.ModelForm):

    class Meta:
    model = models.StudentStudyRecord
    fields = ["score","homework_note"] #要在前端修改的字段


    #批量修改的学生成绩视图类

    class RecordScoreView(View):

    def get(self, request, csr_id):

    from django.forms.models import modelformset_factory#导入组件!

    model_formset_cls = modelformset_factory(model=models.StudentStudyRecord,form=StudentStudyRecordForm,extra=0)#把数据库表实例化一个对象

    queryset = models.StudentStudyRecord.objects.filter(classstudyrecord=csr_id)

    formset = model_formset_cls(queryset=queryset)

    return render(request, 'student/record_score.html', locals())

    def post(self, request, csr_id):
    from django.forms.models import modelformset_factory
    model_formset_cls = modelformset_factory(model=models.StudentStudyRecord,form=StudentStudyRecordForm,extra=0)
    queryset = models.StudentStudyRecord.objects.filter(classstudyrecord=id)
    formset = model_formset_cls(request.POST)#提交post请求,校验成功直接保存.
    if formset.is_valid():
    formset.save()
    return self.get(request, csr_id=csr_id)


    3.html:
        <div class="panel panel-default">
    <div class="panel-heading">学习记录</div>
    <div class="panel-body">
    <div style=" 680px;margin: 0 auto;">
    <form method="post" action="">
    {% csrf_token %}
    {{ formset.management_form }}  #后端使用modelformset组件时,前端必须加上这一句话!

    <table class="table table-bordered">
    <thead>
    <tr>
    <th>姓名</th>
    <th>考勤</th>
    <th>作业成绩</th>
    <th>作业评语</th>
    </tr>
    </thead>
    <tbody>
    {% for form in formset %}
    <tr>
    {{ form.id }}
    <td>{{ form.instance.student }}</td>   #instance加上,前端渲染的页面就没有这个修改项
    <td>{{ form.instance.get_record_display }} </td>
    <td>{{ form.score }} </td>
    <td>{{ form.homework_note }}</td>
    </tr>
    {% endfor %}
    </tbody>
    </table>
    <input type="submit" value="保存" class="btn-danger">
    </form>
    </div>
    </div>



    </div>
    </div>


  • 相关阅读:
    Cookie中用户登录信息的提示
    利用CentOS系统IPtables防火墙添加网站IP白名单
    php5.3升级到5.5
    nginx+apache 404错误页面
    启用nginx status状态详解
    nginx前端负载,后端apache获取真实IP设置
    CentOS查看系统信息-CentOS查看命令
    nginx负载 发向代理配置文件参考
    Linux添加用户(user)到用户组(group)
    Centos6.5快速配置可用网卡
  • 原文地址:https://www.cnblogs.com/cou1d/p/12208429.html
Copyright © 2020-2023  润新知