2016-11-24 6 views
1

お願いします。 これはmodel.pyNameError:名前 '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

答えて

0

anon_session_scoreはクラスメソッド(すなわち、ビューに属しているメソッドなので)、self.anon_session_scoreでアクセスする必要があります。

また、同じ理由から、ビュー内の他のすべてのメソッドと同様に、最初のパラメータとしてselfが必要です。

def anon_session_score(self, session, to_add=0, possible=0): 
関連する問題