我有一个表单,用户输入问题的答案。如果答案是正确的,用户将被重定向到下一个问题。
我遵循的网址模式是, 127.0.0.1:8000/question/1
127.0.0.1:8000/question/2等等。
我将表单发布到验证发生的同一视图。但是没有表单验证,用户可以访问后续的url和以前的url。现在不处理用户的注册。任何用户都可以参加测验。那么在这种情况下如何阻止用户直接访问网址?
我知道这是一个简单的基本问题。在django的新手通过构建东西来学习。有什么帮助?。
提前致谢
{% 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())
答案 0 :(得分:2)
Django在django.contrib.formtools
中包含一个名为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(...)
答案 1 :(得分:1)
我提供来自同一网址的所有问题,即删除&#34; /&#34;部分在最后 - 现在用户无法修改URL以获得任何其他问题。对于GET请求,您可以在数据库中查询第一个未答复的问题(我假设您存储了所有答案)并显示该问题。
答案 2 :(得分:1)
所以,有一些事情:第一,我没有看到你通过&#34;问题&#34;到你的模板,但你称之为(&#34; question.que&#34;)。我也没有看到你使用&#34;数据&#34;你要经过的。我假设您的意思是使用数据而不是问题?
无论如何,你能做的就是这样:
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")
并且您可以将问题ID从表单来回传递给视图函数,并在问题得到正确回答时在视图函数中递增。
更新:
我不确定这是否有效:您的评论,但您可以尝试在display.html中使用javascript。类似的东西:
<script>
$("#text-box").val("");
</script>
我的想法是,当你重新渲染到响应时它会执行......