【问题标题】:How to get multiple values from a template and update multiple fields in a rows of thesame table in django如何从模板中获取多个值并更新django中同一表的一行中的多个字段
【发布时间】:2018-11-14 11:04:37
【问题描述】:

我正在开发一个结果处理网站,我一直在尝试更新表格每一行中的多个字段。用户应该能够输入更新的 CA 分数和考试分数值,并且它应该更新每个学生已提交的 CA 分数和考试分数值。 image of page

有人问同样的问题here 试图更新单个字段。我尝试使用那里提供的解决方案,但无法满足我的需要

模板

<form action="" method="post"> {% csrf_token %}
{% for student in students %}
<tr>
  <td>{{ student.id_number }}</td>
  <td>
   <input type="number" value="{{ student.ca }}" name="student_{{ student.id }}">
  </td>
  <td>
   <input type="number" value="{{ student.exam }}" name="student_{{ student.id }}">
  </td>
</tr>
{% endfor %}
<tr>
  <td><input type="submit" value="Save"></td>
</tr>
</tbody>
</table>
</form>

查看

def add_score_for(request, id):
    if request.method == 'GET':
        students = TakenCourse.objects.filter(course__allocated_course__lecturer__pk=request.user.id).filter(course__id=id)
        context = { "students":students}
        return render(request, 'result/add_score_for.html', context)

    if request.method == 'POST':
        data = request.POST.dict()
        data.pop('csrfmiddlewaretoken', None)
        for i in data.items():
            obj = TakenCourse.objects.get(id=i[0].split("_")[1])
            if not str(obj.ca) == str(i[1]): # if i do i[2] trying to get for exams it raise 'tuple index out of range'
                obj.ca = i[1]
                obj.save()

【问题讨论】:

    标签: django django-models django-templates


    【解决方案1】:

    在普通的 Django 中,你可以使用 Formsets 解决这个问题: https://docs.djangoproject.com/en/2.1/topics/forms/formsets/

    这将生成您需要更新多个学生的标记(或允许您生成标记),然后在提交时更新这些学生。它还允许添加条目(您可以禁用此功能)。

    【讨论】:

    • 感谢您的回复,我只是尝试使用 formset,但我返回单行而不是模型中的所有可用行。
    • 您需要将所有行作为initial 传递,参见docs.djangoproject.com/en/2.1/topics/forms/formsets/…
    • 非常感谢您的帮助,但我使用上述方法解决了问题
    【解决方案2】:

    这是我解决问题的方法,不知道这是不是最好的方法,但它确实解决了我的问题

    观看次数

    @lecturer_required 
    def add_score_for(request, id):
        current_semester = Semester.objects.get(is_current_semester=True)
        if request.method == 'GET':
            ...
            return render(request, 'result/add_score_for.html', context)
    
        if request.method == 'POST':
            ids = ()
            data = request.POST.copy()
            data.pop('csrfmiddlewaretoken', None) # remove csrf_token
            for key in data.keys():
                ids = ids + (str(key),)      # gather all the all students id (i.e the keys) in a tuple
            for s in range(0,len(ids)):      # iterate over the list of student ids gathered above
                score = data.getlist(ids[s]) # get list of score for current student in the loop
                ca = score[0]                # subscript the list to get the fisrt value > ca score
                exam = score[1]              # do thesame for exam score
                obj = TakenCourse.objects.get(student__pk=ids[s]) # get the current student data
                obj.ca = ca # set current student ca score
                obj.exam = exam # set current student exam score
                obj.total = obj.get_total(ca=ca,exam=exam)
                obj.grade = obj.get_grade(ca=ca,exam=exam)
                obj.comment = obj.get_comment(obj.grade)
                obj.save()
            return HttpResponseRedirect(reverse_lazy('add_score_for', kwargs={'id': id}))
        return HttpResponseRedirect(reverse_lazy('add_score_for', kwargs={'id': id}))
    

    【讨论】:

      猜你喜欢
      • 2017-09-19
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多