【发布时间】:2016-07-10 10:45:43
【问题描述】:
我正在 Django 中使用一个测验网络应用程序,该应用程序需要保留每个问题都提交的表单。问题显示得恰到好处。尝试提交带有问题的表单时会出现问题。
问题的答案(多选,4 个答案)显示在<li> 元素中。我希望通过单击答案(因此,单击<li> 元素)提交答案,以便显示下一个问题。我无法让它工作,所以我无法得到任何提交的答案。表单 HTML 如下所示:
<form id="game" action="" method="POST">{% csrf_token %}
<input type="hidden" name="question_id" value="{{ question.id }}">
<input type="hidden" name="answer">
<ul class="list-group">
{% for answer in form.answers %}
<li class="list-group-item" name="answer" value="{{answer}}">
{% endfor %}
</ul>
jQuery 是这样的:
$(document).ready(function() {
$('#game li').click(function() {
$('input[name="answer"]').val($(this).value('answer'));
$('#game').submit();
});
});
单击答案'<li> 时没有任何反应,并且控制台不显示任何日志。
我怎样才能使它工作?谢谢。
编辑 1:
是的,我有管理测验的 views.py,这是一个 sn-p:
class QuizTake(FormView):
form_class = QuestionForm
template_name = 'question.html'
def dispatch(self, request, *args, **kwargs):
self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
if self.quiz.draft and not request.user.has_perm('quiz.change_quiz'):
raise PermissionDenied
self.logged_in_user = self.request.user.is_authenticated()
if self.logged_in_user:
self.sitting = Sitting.objects.user_sitting(request.user,
self.quiz)
else:
self.sitting = self.anon_load_sitting()
if self.sitting is False:
return render(request, 'single_complete.html')
return super(QuizTake, self).dispatch(request, *args, **kwargs)
def get_form(self, form_class):
if self.logged_in_user:
self.question = self.sitting.get_first_question()
self.progress = self.sitting.progress()
else:
self.question = self.anon_next_question()
self.progress = self.anon_sitting_progress()
if self.question.__class__ is Essay_Question:
form_class = EssayForm
return form_class(**self.get_form_kwargs())
def get_form_kwargs(self):
kwargs = super(QuizTake, self).get_form_kwargs()
return dict(kwargs, question=self.question)
def form_valid(self, form):
if self.logged_in_user:
self.form_valid_user(form)
if self.sitting.get_first_question() is False:
return self.final_result_user()
else:
self.form_valid_anon(form)
if not self.request.session[self.quiz.anon_q_list()]:
return self.final_result_anon()
self.request.POST = {}
return super(QuizTake, self).get(self, self.request)
def get_context_data(self, **kwargs):
context = super(QuizTake, self).get_context_data(**kwargs)
context['question'] = self.question
context['quiz'] = self.quiz
if hasattr(self, 'previous'):
context['previous'] = self.previous
if hasattr(self, 'progress'):
context['progress'] = self.progress
return context
def form_valid_user(self, form):
progress, c = Progress.objects.get_or_create(user=self.request.user)
guess = form.cleaned_data['answers']
is_correct = self.question.check_if_correct(guess)
if is_correct is True:
self.sitting.add_to_score(1)
progress.update_score(self.question, 1, 1)
else:
self.sitting.add_incorrect_question(self.question)
progress.update_score(self.question, 0, 1)
if self.quiz.answers_at_end is not True:
self.previous = {'previous_answer': guess,
'previous_outcome': is_correct,
'previous_question': self.question,
'answers': self.question.get_answers(),
'question_type': {self.question
.__class__.__name__: True}}
else:
........
这也是从 forms.py 获取信息:
class QuestionForm(forms.Form):
def __init__(self, question, *args, **kwargs):
super(QuestionForm, self).__init__(*args, **kwargs)
choice_list = [x for x in question.get_answers_list()]
self.fields["answers"] = forms.ChoiceField(choices=choice_list,
widget=forms.RadioSelect)
我已经更改了您提供给我的代码并尝试了不同的组合,但仍然无法正常工作。我无法提交表单,控制台没有显示错误。这不可能吗?
编辑 2:
当我更改 HTML 代码并尝试像这样放置“<li>”标签时:
<li class="list-group-item" name="answer" data-answer="{{answer}}">{{answer}}</li>
我将此作为输出(在本例中为 2 个可能的答案,显示 2 个 <li> 元素):
当我退出 li 元素的“数据答案”时,它得到:
现在,当我将鼠标放在文本上时,它不会得到'cursor:pointer',而之前在'False">' 中却得到了。但是,当我单击它时,什么也没有发生。可能是'views.py' 的问题吗?在我使用“提交”按钮之前,它运行良好。 @JacobWindsor
我是否说明了这个问题?我很困惑谢谢你的回答。
【问题讨论】:
-
额外的
">的问题肯定是因为不正确的HTML。您提供的 HTML 很好,但您拥有的 HTML 肯定有一些不一致之处。我会是cursor:pointer的问题也是因为不正确的 HTML。 -
请问,您为什么要在每个答案上提交 AJAX?为什么不直接列出所有问题和答案,然后在最后用按钮提交?
-
我试图通过单击答案而不是选择答案然后单击提交来使其更容易和更具交互性,如果它不会改变整个事情,因为这种交互性需要很多代码和新东西。感谢您的回答,谢谢雅各布。
标签: javascript jquery django forms