Django - избегайте ложных записей, если pk динамического URL изменен - PullRequest
0 голосов
/ 27 июня 2018

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

В основном приложение создает динамический URL для каждого учителя, например:

  • Учитель Майк: mywebsite.com/teacher/1
  • Учитель Брайан: mywebsite.com/teacher/2

Числа соответствуют ПК каждого учителя. Студент заполняет опрос и при отправке сначала проверяет в базе данных, что ответы не были отправлены ранее (чтобы избежать дубликатов). Если ответ уже был сохранен ранее, отображается страница с указанием этого.

Все работает нормально, но есть проблема, если пользователь (студент) выполняет странное действие. Когда ученик оценивает, например, Учителя Майка: генерируется URL-адрес mywebsite.com/teacher/rate/1 и отображается шаблон, в котором говорится, что ответ сохранен. Проблема возникает здесь:

Если человек в то время изменил число (pk) в URL, например, с 1 на 2, приложение сохраняет ответы учителя-1 в записи учителя-2.

уточнение : если учащемуся назначены учителя 1, 2 и 3 и он изменяет pk в URL-адресе на 5, проблем не возникает, поскольку приложение обнаруживает, что ученик не имеет разрешения на оценку учитель. Проблема заключается в том, что если его изменить с 1 на 3, например, поскольку у ученика есть разрешение на оценку обоих учеников.

Я знаю, это странное поведение. Но я бы хотел найти способ решить эту проблему.

Вид для представления ответов таков:

def send(request, user_pk):
    if not request.user.is_authenticated:
        return HttpResponseRedirect('/accounts/login/')
    else:
        #first look for the record not to exist in the DB to avoid duplicate records
        exist = Answers.objects.filter(name= request.user, teacher= user_pk ).exists()
        # if there is not then I proceed to create the record in the database
        if exist == False:
            for key, value in request.POST.items():
                if clave != 'csrfmiddlewaretoken':
                    Answers.objects.create(question=int(clave), answer_to_question=int(valor), student = request.user,teacher = int(user_pk)) 
            #then I change a record in the table of my DB where the finished evaluations are stored, from false to true.  
            actual_state= State.objects.get(student__name = request.user, teacher = user_pk)
            actual_state.finished_evaluation = True
            actual_state.save()
            return render(request,"myapp\send.html") 
        else:
            return render(request,"myapp\error.html") 

1 Ответ

0 голосов
/ 27 июня 2018

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

Например, если в модели Teacher поле many-to-many имеет значение User, вы можете выполнить фильтрацию, чтобы пользователи могли отправлять ответы только для своих учителей.

from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404

@login_required
def send(request, user_pk):
    teacher = get_object_or_404(Teacher, students=request.user)
    exist = Answers.objects.filter(name= request.user, teacher=teacher).exists()

Примечание. Я использовал описанный выше декоратор login_required, чтобы вам не приходилось перенаправлять пользователей, которые не вошли в систему.

...