Как получить несколько значений из шаблона и обновить несколько полей в одной и той же таблице в django - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над сайтом обработки результатов и пытаюсь обновить несколько полей в каждой строке таблицы. Пользователь должен иметь возможность вводить обновленные значения CA Score и EXAM Score, а также должен обновлять значения CA Score и EXAM каждого учащегося, которые были представлены. изображение страницы

Кто-то задает тот же вопрос здесь , пытаясь обновить одно поле. Я пытался работать с предоставленным там решением, но не смог заставить его удовлетворить мои потребности

шаблон

<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()

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вот как я решил свою проблему, не знаю, является ли это лучшим способом сделать это, но она действительно решила мою проблему

вид

@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}))
0 голосов
/ 14 ноября 2018

В простом Django вы можете решить эту проблему, используя Formsets: https://docs.djangoproject.com/en/2.1/topics/forms/formsets/

Это сгенерирует разметку (или позволит вам сгенерировать разметку), вам нужно обновить несколько учеников, которые затем будут обновлены при отправке.Также позволяет добавлять записи (вы можете отключить эту функцию).

...