1
お願いします。 これはmodel.py
NameError:名前 'anon_session_score'はdjangoで定義されていません1.10
from django.db import models
import re
from model_utils.managers import InheritanceManager
# Create your models here.
class Subject(models.Model):
subject=models.CharField(max_length=250,unique=True, blank=False)
class Meta:
verbose_name="Предмет"
verbose_name_plural = "Предметы"
def __str__(self):
return self.subject
class Quiz(models.Model):
name=models.CharField(max_length=120,blank=False)
url=models.SlugField(max_length=120,blank=False)
subject=models.ForeignKey(Subject)
random_order = models.BooleanField(blank=False,default=False)
answers_at_end = models.BooleanField(blank=False,default=False)
def save(self,force_insert=False, force_update=False, *args,**kwargs):
self.url = re.sub(r'\s+','-',self.url).lower()
self.url=''.join(letter for letter in self.url if letter.isalnum() or letter=='-')
super(Quiz,self).save(force_insert,force_update,*args,**kwargs)
class Meta:
verbose_name="Тест"
verbose_name_plural="Тесты"
def __str__(self):
return self.name
def get_questions(self):
return self.question_set.all().select_subclasses()
def anon_score_id(self):
return str(self.id)+"_score"
def anon_q_list(self):
return str(self.id)+"_q_list"
def anon_q_data(self):
return str(self.id)+"_data"
class Question(models.Model):
quiz = models.ManyToManyField(Quiz,verbose_name=u"Тест",blank=True)
figure = models.ImageField(upload_to='uploads/%Y/%m/%d',blank=True,null=True)
content=models.CharField(max_length=1000,blank=False)
random_order=models.BooleanField(blank=False,default=False)
objects=InheritanceManager()
class Meta:
verbose_name="Вопрос"
verbose_name_plural="Вопросы"
def __str__(self):
return self.content
def get_score(self,guess):#сюда надо положить все выбранные варианты пользоватля
all_answers=Answer.objects.filter(question=self)
rights=0
for q_answer in all_answers:
if q_answer.correct is True:
rights+=1
corrects=0
incorrects=0
for guess_id in guess:
answer = Answer.objects.get(id=guess_id)
if answer.correct is True:
corrects+=1
else:
incorrects+=1
if (rights==corrects)and(incorrects==0):
return 2
elif (rights%corrects==1)and(incorrects==1):
return 1
elif (rights%corrects>1)and(incorrects>1):
return 0
def random_answers(self,queryset):
if self.random_order is True:
return queryset.order_by('?')
else:
return queryset.order_by()
def get_answers(self):
return self.random_answers(Answer.objects.filter(question=self))
def get_answers_list(self):
return [(answer.id,answer.answer)for answer in
self.random_answers(Answer.objects.filter(question=self))]
def answer_choice_to_string(self, guess):
return Answer.objects.get(id=guess).answer
class Answer(models.Model):
question=models.ForeignKey(Question, verbose_name="Вопрос")
answer=models.CharField(max_length=1000,blank=False)
correct=models.BooleanField(blank=False,default=False)
def __str__(self):
return self.answer
class Meta:
verbose_name="Ответ"
verbose_name_plural="Ответы"
であり、これはあるviews.py
from django.shortcuts import render, get_object_or_404
# Create your views here.
from django.views.generic import *
from .forms import QuestionForm
from .models import *
import random
class QuizListView(ListView):
model=Quiz
def get_queryset(self):
queryset=super(QuizListView,self).get_queryset()
return queryset
class QuizDetailView(DetailView):
model=Quiz
slug_field='url'
def get(self,request,*args,**kwargs):
self.object=self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
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'])
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=QuestionForm):
self.question=self.anon_next_question()
self.progress=self.anon_sitting_progress()
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):
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 anon_load_sitting(self):
if self.quiz.anon_q_list() in self.request.session:
return self.request.session[self.quiz.anon_q_list()]
else:
return self.new_anon_quiz_session()
def new_anon_quiz_session(self):
self.request.session.set_expiry(259200)
questions = self.quiz.get_questions()
question_list=[question.id for question in questions]
if self.quiz.random_order is True:
random.shuffle(question_list)
self.request.session[self.quiz.anon_score_id()]=0
self.request.session[self.quiz.anon_q_list()]=question_list
self.request.session[self.quiz.anon_q_data()]=dict(
incorrect_questions=[],
order=question_list,
)
return self.request.session[self.quiz.anon_q_list()]
def anon_next_question(self):
next_question_id = self.request.session[self.quiz.anon_q_list()][0]
return Question.objects.get_subclass(id=next_question_id)
def anon_sitting_progress(self):
total=len(self.request.session[self.quiz.anon_q_data()]['order'])
answered = total - len(self.request.session[self.quiz.anon_q_list()])
return (answered,total)
def form_valid_anon(self,form):
guess = form.cleaned_data['answers']
score_to = self.question.get_score(guess)
#добавить очки
if score_to==2:
self.request.session[self.quiz.anon_score_id()]+=1
else:
self.request.session[self.quiz.anon_q_data()]['incorrect_questions'].append(self.question.id)
anon_session_score(self.request.session, score_to,2)
self.previous={}
if self.quiz.answers_at_end is not True:
self.previous={
'previous_answers':guess,
'previous_outcome':score_to,
'previous_question':self.question,
'answers':self.question.get_answers(),
'question_type':{self.question.__class__.__name__:True}
}
self.request.session[self.quiz.anon_q_list()]=self.request.session[self.quiz.anon_q_list()][1:]
def final_result_anon(self):
score = self.request.session[self.quiz.anon_score_id()]
q_order = self.request.session[self.quiz.anon_q_data()]['order']
session, session_possible = anon_session_score(self.request.session)
if score is 0:
score = "0"
results={
'score':score,
'session':session,
'possible':session_possible
}
del self.request.session[self.quiz.anon_q_list()]
if self.quiz.answers_at_end:
results['questions']=sorted(
self.quiz.question_set.filter(id__in=q_order).select_subclasses(),
key=lambda q: q_order.index(q.id)
)
results['incorrect_questions']=(
self.request.session[self.quiz.anon_q_data()]['incorrect_questions']
)
else:
results['previous']=self.previous
del self.request.session[self.quiz.anon_q_data()]
return render(self.request,'result.html',results)
def anon_session_score(session,to_add=0, possible=0):
if "session_score" not in session:
session["session_score"],session["session_score_possible"] = 0,0
if possible>0:
session["session_score"]+=to_add
session["session_score_possible"]+=possible
return session["session_score"], session["session_score_possible"]
トレースバック:ビューは、関数を参照してくださいしない理由
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/matem13/take/
Django Version: 1.10.3
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'voud_quiz']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "D:\virt_voud\lib\site-packages\django\core\handlers\exception.py" in inner
39. response = get_response(request)
File "D:\virt_voud\lib\site-packages\django\core\handlers\base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "D:\virt_voud\lib\site-packages\django\core\handlers\base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\virt_voud\lib\site-packages\django\views\generic\base.py" in view
68. return self.dispatch(request, *args, **kwargs)
File "D:\virt_voud\src\voud_quiz\views.py" in dispatch
35. return super(QuizTake,self).dispatch(request,*args, **kwargs)
File "D:\virt_voud\lib\site-packages\django\views\generic\base.py" in dispatch
88. return handler(request, *args, **kwargs)
File "D:\virt_voud\lib\site-packages\django\views\generic\edit.py" in post
183. return self.form_valid(form)
File "D:\virt_voud\src\voud_quiz\views.py" in form_valid
49. self.form_valid_anon(form)
File "D:\virt_voud\src\voud_quiz\views.py" in form_valid_anon
104. anon_session_score(self.request.session, score_to,2)
Exception Type: NameError at /matem13/take/
Exception Value: name 'anon_session_score' is not defined
が、私は理解していないanon_session_score