2016-04-16 33 views
-1

嘗試進行測驗時發生錯誤。儘管我的頁面的屬性錯誤與in this topic相同,但該解決方案尚未解決我的問題。Django測驗應用程序:屬性錯誤

我已經嘗試了上述主題中提到的解決方案,但它沒有解決我的問題。我將Django Quiz中的所有應用程序混合在一起,將模型放在同一個文件中,等等。目前它已正常工作,並且我已經能夠管理'管理員'頁面中的設置而沒有任何問題。

問題依靠服用測驗時,我收到此回溯:

Internal Server Error: /myquiz/take/ 
Traceback (most recent call last): 
    File "C:\P4\myapp\models.py", line 359, in user_sitting 
    sitting = self.get(user=user, quiz=quiz, complete=False) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\db\models\manager.py", line 122, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\db\models\query.py", line 387, in get 
    self.model._meta.object_name 
myapp.models.DoesNotExist: Sitting matching query does not exist. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\core\handlers\base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\core\handlers\base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\views\generic\base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "C:\P4\myapp\views.py", line 163, in dispatch 
    self.quiz) 
    File "C:\P4\myapp\models.py", line 361, in user_sitting 
    sitting = self.new_sitting(user, quiz) 
    File "C:\P4\myapp\models.py", line 339, in new_sitting 
    questions = ",".join(map(str, questions_set)) + "," 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\db\models\query.py", line 258, in __iter__ 
    self._fetch_all() 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\db\models\query.py", line 1074, in _fetch_all 
    self._result_cache = list(self.iterator()) 
    File "C:\Python\lib\site-packages\model_utils\managers.py", line 80, in iterator 
    sub_obj = self._get_sub_obj_recurse(obj, s) 
    File "C:\Python\lib\site-packages\model_utils\managers.py", line 153, in _get_sub_obj_recurse 
    node = getattr(obj, rel) 
AttributeError: 'int' object has no attribute 'essay_question' 

好像這個問題可能是在essay_question模型或坐在模型。但是,我找不到這個問題的答案。這裏有一些我認爲與錯誤有關的代碼,但是如果需要更多的代碼(大多數部分與Django的Quiz應用程序保持一致)。

坐在經理模式

class SittingManager(models.Manager): 

    def new_sitting(self, user, quiz): 
     if quiz.random_order is True: 
      questions_set = quiz.questions_set.all() \ 
              .select_subclasses() \ 
              .order_by('?') 
     else: 
      questions_set = quiz.questions_set.all() \ 
              .select_subclasses() 

     questions_set = questions_set.values_list('id', flat=True) 

     if questions_set.count() == 0: 
      raise ImproperlyConfigured('Question set of the quiz is empty. ' 
             'Please configure questions properly') 

     if quiz.max_questions and quiz.max_questions < questions_set.count(): 
      questions_set = questions_set[:quiz.max_questions] 

     questions = ",".join(map(str, questions_set)) + "," 

     new_sitting = self.create(user=user, 
            quiz=quiz, 
            question_order=questions, 
            question_list=questions, 
            incorrect_questions="", 
            current_score=0, 
            complete=False, 
            user_answers='{}') 
     return new_sitting 

    def user_sitting(self, user, quiz): 
     if quiz.single_attempt is True and self.filter(user=user, 
                 quiz=quiz, 
                 complete=True)\ 
               .exists(): 
      return False 

     try: 
      sitting = self.get(user=user, quiz=quiz, complete=False) 
     except Sitting.DoesNotExist: 
      sitting = self.new_sitting(user, quiz) 
     except Sitting.MultipleObjectsReturned: 
      sitting = self.filter(user=user, quiz=quiz, complete=False)[0] 
     return sitting 

而且QuizTake視圖

EDITED

,因爲它不是其他類似的相同的解決方案,我將不勝感激答案與此應用程序錯誤。我會提供更多所需的信息,並感謝您的幫助。

編輯2:

現在我得到這個試圖去 'myquiz /採取' 視圖:

Internal Server Error: /myquiz/take/ 
Traceback (most recent call last): 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\core\handlers\base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\core\handlers\base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\views\generic\base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "C:\P4\myapp\views.py", line 171, in dispatch 
    return super(QuizTake, self).dispatch(request, *args, **kwargs) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\views\generic\base.py", line 88, in dispatch 
    return handler(request, *args, **kwargs) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\views\generic\edit.py", line 213, in get 
    return self.render_to_response(self.get_context_data()) 
    File "C:\P4\myapp\views.py", line 206, in get_context_data 
    context = super(QuizTake, self).get_context_data(**kwargs) 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\views\generic\edit.py", line 122, in get_context_data 
    kwargs['form'] = self.get_form() 
    File "C:\Python\lib\site-packages\django-1.9.1-py3.5.egg\django\views\generic\edit.py", line 35, in get_form_with_form_class 
    return get_form(self, form_class=form_class) 
    File "C:\P4\myapp\views.py", line 184, in get_form 
    return form_class(**self.get_form_kwargs()) 
TypeError: __init__() missing 1 required positional argument: 'question' 

這裏有我的views.py的提取物(這似乎導致錯誤):

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) 

Get_form

def get_form(self, form_class): 
     if self.logged_in_user: 
      self.questions = self.sitting.get_first_questions() 
      self.progress = self.sitting.progress() 
     else: 
      self.questions = self.anon_next_questions() 
      self.progress = self.anon_sitting_progress() 

     if self.questions.__class__ is Essay_Questions: 
      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, questions=self.questions) 

FORM_VALID和get_context_data

def form_valid(self, form): 
     if self.logged_in_user: 
      self.form_valid_user(form) 
      if self.sitting.get_first_questions() 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.questions 
     context['quiz'] = self.quiz 
     if hasattr(self, 'previous'): 
      context['previous'] = self.previous 
     if hasattr(self, 'progress'): 
      context['progress'] = self.progress 
     return context 
+0

我不明白-1。有人能告訴我,而不是選擇低箭頭繼續前進嗎? http://meta.stackoverflow.com/questions/253924/what-to-do-when-the-question-you-want-to-ask-is-a-duplicate?rq=1 – Jim

回答

1

myapp.models.DoesNotExist: Sitting matching query does not exist.

這意味着正是它說。 YOu正試圖獲取一個不存在的座標對象。所以你需要用try except來解決359行的問題,以便很好地處理這種情況。實際上,您可以按照以下方式簡化整個方法。

def user_sitting(self, user, quiz): 
    if quiz.single_attempt is True and self.filter(user=user, 
                quiz=quiz, 
                complete=True)\ 
              .exists(): 
     return False 

    try: 
     return self.filter(user=user,quiz=quiz,complete=True)[0] 
    except IndexError: 
     return sitting = self.new_sitting(user, quiz) 

簡單的代碼更容易維護,並且您減少了查詢的數量,從而提高了性能。

AttributeError: 'int' object has no attribute 'essay_question'

這意味着,你認爲你^ h有Questions實例,但你真正擁有的是一元。堆棧跟蹤的其餘部分爲您提供導致此錯誤的執行線。看看提到你自己的代碼的行,有些地方你正在調用一個應該返回一個Questions實例但返回int的方法。

它曾經工作和不再工作的原因是所謂的迴歸錯誤。某些代碼段的更改導致另一部分操作失誤。解決這些問題最流行,最可持續的方法是使用單元測試。

+0

非常感謝您的支持回答。我已經用第359行的摘錄編輯了第一篇文章,其中已經有一個嘗試除外。處理這種情況不正確嗎? 我一直在審查代碼,我無法找到返回int的方法。它會是什麼,爲什麼?我不知道在提到我的代碼的行中改變了什麼,我嘗試了幾次更改但沒有成功。謝謝 – Jim

+0

我也覺得很自豪地提一下,/ quiz/take頁面工作了一段時間(它沒有顯示錯誤),但它只顯示了簡單的base.html頁面(帶有樣式但沒有圖像,也沒有jQuery加載),它沒有迴應我所做的任何改變(它總是顯得相同)。現在錯誤再次出現。謝謝。 – Jim

+0

注意到並更新了答案,如果您可以編輯問題並僅保留最相關的位(例如,堆棧跟蹤中的行號前後約5行),那麼可能會更容易讓某人提供幫助。 – e4c5