2014-09-18 3 views
0

У меня есть форму, где пользователь вводит ответ на вопрос. Если ответ верный, пользователь перенаправляется на следующий вопрос.Предотвращение доступа пользователя к последующему URL-адресу в django

шаблон URL Я следую за это, 127.0.0.1:8000/question/1

127.0.0.1:8000/question/2 и так далее.

Я отправляю форму в тот же вид, где происходит проверка. Но без проверки формы пользователь может получить доступ к следующему URL-адресу и предыдущему URL-адресу. Прямо сейчас я не обрабатываю регистрацию для пользователя. Любой пользователь может пройти тест. поэтому в этом случае Как запретить пользователю напрямую обращаться к URL-адресам?

Я знаю, что это простой базовый вопрос. Новичок в обучении джанго путем создания чего-то. Любая помощь?.

Заранее спасибо

{% extends 'base.html' %} 

{% block title %}{% endblock %} 

{% block body_block %} 

      <p><strong>Your question {{ quesno_id.id}} of {{ total_ques }}: </strong></p> 
      "{{ question.que }}" 
      <p><strong>Type your answer here :</strong></p> 
      <form id='song_form' method = 'post' action="">{% csrf_token %} 
       {% for hidden in form.hidden_fields %} 
        {{ hidden }} 
       {% endfor %} 

       {% for field in form.visible_fields %} 
        {{ field.errors }} 
        {{ field.help_text }} 
        {{ field }} 
       {% endfor %} 
       <br></br> 
       <input type ="submit" name="submit" value="Submit"/> 
      </form> 

    {% endblock %} 

def display_question(request,question_id): 
    context = RequestContext(request) 
    try: 
     quesno_id = {'id':question_id} 
     data = data.objects.get(id=question_id) 
     total_ques = data.objects.all().count() 
    except data.DoesNotExist: 
     pass 

    if request.method == 'POST': 
     form = que_form(request.POST) 
     if form.is_valid():  
      user_answer = form.cleaned_data['answer'] 
      if data.name.strip() == user_answer.strip(): 
       if int(question_id) < int(total_ques): 
        return HttpResponseRedirect("/question/%s/" % (int(question_id)+1)) 
       else: 
        return HttpResponse('Game over') 
      else: 
       return HttpResponse("Your answer is wrong") 
     else: 
      print form.errors 
    else: 
     form = que_form() 
    return render_to_response('display_question.html',{'form':form,'data':data,'quesno_id':quesno_id,'total_ques':total_ques},context) 

from django import forms 
class que_form(forms.Form): 
    answer = forms.CharField(widget=forms.TextInput()) 

ответ

1

Так, несколько вещей: первое, я не вижу, вы проходя «вопрос» в шаблон, но вы называете его («question.que»). Я также не вижу, что вы используете «данные», которые вы передаете. Я предполагаю, может быть, вы хотите использовать данные вместо вопроса?

В любом случае, что вы можете сделать что-то вроде этого:

if data.name.strip() == user_answer.strip(): 
    if int(question_id) < int(total_ques): 
     return render_to_response('display_question.html', {'form':form,'data':data,'quesno_id':quesno_id,'total_ques':total_ques},context) 
    else: 
     return HttpResponse('Game over') 
else: 
    return HttpResponse("Your answer is wrong") 

и вы могли бы передать вопрос идентификатор назад и вперед от формы к функции просмотра и увеличения его в функции зрения всякий раз, когда вопрос отвечает правильно.

UPDATE:

Я не уверен, если это будет работать: Re: Ваш комментарий, но вы можете попробовать только с помощью JavaScript в display.html. Что-то вроде:

<script> 
    $("#text-box").val(""); 
    </script> 

Мое мышление состояло в том, что оно будет выполняться, когда вы повторно отнеситесь к ответу ...

+0

Да, это 'data.que'. Моя ошибка. Я реализовал то, как вы сказали, это работает, но поскольку я передаю форму на ту же страницу (display_question.html), предыдущее значение, введенное в текстовое поле, остается неясным. Как визуализировать новую форму без ранее введенного значения? – user

+0

См. Мой комментарий ... Я не уверен на 100%, я понимаю, о чем вы спрашиваете, но посмотрите, что я предлагаю, что вам нужно. –

+0

Я попробовал. Данные очищаются в текстовом поле справа даже перед тем, как сделать запрос POST для поддержки кода представления django, потому что я вызываю функцию Js, чтобы очистить значение при создании формы. Таким образом, я снова отобрал пустую форму. Это сработало :) Спасибо за Помогите – user

1

Я бы обслуживать все вопросы из того же URL, то есть падение "/" часть в конце - теперь пользователи не может изменить URL-адрес, чтобы перейти к любому другому вопросу. Для запросов GET вы можете запросить базу данных для первого неотвеченного вопроса (я предполагаю, что вы храните все ответы) и отобразите это.

+0

Да, я пробовал это делать. Я не знал, как отображать только один вопрос за раз в форме. Поэтому я пошел с логикой итерации 'question_id' каждый раз и показывая один вопрос для каждого URL-адреса. Может быть, какой-то пример может помочь? – user

+0

В примере кода, который вы указали, вы вызываете функцию 'que_form()', это дает вам форму для вопроса? На что это похоже? – Simon

+0

Да, это дает мне форму для одного вопроса/url.Пожалуйста, уточните мой обновленный вопрос. Я включил 'form.py' – user

2

В комплект поставки Django входит form wizard, который соответствует вашим потребностям. Он использует сеансы/файлы cookie в форме для проверки доступа к страницам формы в правильном порядке. Возможно, вам захочется изучить, как это работает, или просто использовать то, что доступно, без необходимости иметь дело с вещами самостоятельно.

Если вам нужно/нужно реализовать это самостоятельно, самый простой способ - это, вероятно, сеансы. Установите флажок в сессии, когда вопрос отвечают:

request.sessions['question_{}_answered'.format(question_id)] = True 

и проверить ответы на все предыдущие вопросы при рендеринге следующего вопроса. Что-то вроде ...

for qid in range(1, question_id): 
    if 'question_{}_answered'.format(qid) not in request.sessions: 
     return HttpResponseRedirect('/question/1/') 
# Really renders the question page 
return render_to_response(...) 
+0

Спасибо. Посмотрим. – user

Смежные вопросы