对Django模板的更改未反映出来

问题描述

我按照https://github.com/tomwalker/django_quiz上的说明使用了该项目。 我能够成功使用该项目。 但是,当我更改模板(.html文件)时,没有任何变化。即使我添加删除整个内容。我不确定是否丢失了一些东西。 我签入views.py,但看不到任何html渲染。我是Django新手,发现很难理解views.py并对模板(如问题或类别)进行任何更改。任何帮助将不胜感激。

有趣的是,如果我对原始的base.html进行了任何更改,那么CSS和样式以及base.html中的任何其他更改都将被应用

urls.py代码

urlpatterns = [

    url(r'^$',view=QuizListView.as_view(),name='quiz_index'),url(r'^category/$',view=CategoriesListView.as_view(),name='quiz_category_list_all'),url(r'^category/(?P<category_name>[\w|\W-]+)/$',view=ViewQuizListByCategory.as_view(),name='quiz_category_list_matching'),url(r'^progress/$',view=QuizUserProgressView.as_view(),name='quiz_progress'),url(r'^marking/$',view=QuizMarkingList.as_view(),name='quiz_marking'),url(r'^marking/(?P<pk>[\d.]+)/$',view=QuizMarkingDetail.as_view(),name='quiz_marking_detail'),#  passes variable 'quiz_name' to quiz_take view
    url(r'^(?P<slug>[\w-]+)/$',view=QuizDetailView.as_view(),name='quiz_start_page'),url(r'^(?P<quiz_name>[\w-]+)/take/$',view=QuizTake.as_view(),name='quiz_question'),]

Views.py代码

class QuizMarkerMixin(object):
    @method_decorator(login_required)
    @method_decorator(permission_required('quiz.view_sittings'))
    def dispatch(self,*args,**kwargs):
        return super(QuizMarkerMixin,self).dispatch(*args,**kwargs)


class SittingFilterTitleMixin(object):
    def get_queryset(self):
        queryset = super(SittingFilterTitleMixin,self).get_queryset()
        quiz_filter = self.request.GET.get('quiz_filter')
        if quiz_filter:
            queryset = queryset.filter(quiz__title__icontains=quiz_filter)

        return queryset


class QuizListView(ListView):
    model = Quiz

    def get_queryset(self):
        queryset = super(QuizListView,self).get_queryset()
        return queryset.filter(draft=False)


class QuizDetailView(DetailView):
    model = Quiz
    slug_field = 'url'

    def get(self,request,**kwargs):
        self.object = self.get_object()

        if self.object.draft and not request.user.has_perm('quiz.change_quiz'):
            raise PermissionDenied

        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)


class CategoriesListView(ListView):
    model = Category


class ViewQuizListByCategory(ListView):
    model = Quiz
    template_name = 'view_quiz_category.html'

    def dispatch(self,**kwargs):
        self.category = get_object_or_404(
            Category,category=self.kwargs['category_name']
        )

        return super(ViewQuizListByCategory,self).\
            dispatch(request,**kwargs)

    def get_context_data(self,**kwargs):
        context = super(ViewQuizListByCategory,self)\
            .get_context_data(**kwargs)

        context['category'] = self.category
        return context

    def get_queryset(self):
        queryset = super(ViewQuizListByCategory,self).get_queryset()
        return queryset.filter(category=self.category,draft=False)


class QuizUserProgressView(TemplateView):
    template_name = 'progress.html'

    @method_decorator(login_required)
    def dispatch(self,**kwargs):
        return super(QuizUserProgressView,self)\
            .dispatch(request,**kwargs):
        context = super(QuizUserProgressView,self).get_context_data(**kwargs)
        progress,c = Progress.objects.get_or_create(user=self.request.user)
        context['cat_scores'] = progress.list_all_cat_scores
        context['exams'] = progress.show_exams()
        return context


class QuizMarkingList(QuizMarkerMixin,SittingFilterTitleMixin,ListView):
    model = Sitting

    def get_queryset(self):
        queryset = super(QuizMarkingList,self).get_queryset()\
                                               .filter(complete=True)

        user_filter = self.request.GET.get('user_filter')
        if user_filter:
            queryset = queryset.filter(user__username__icontains=user_filter)

        return queryset


class QuizMarkingDetail(QuizMarkerMixin,DetailView):
    model = Sitting

    def post(self,**kwargs):
        sitting = self.get_object()

        q_to_toggle = request.POST.get('qid',None)
        if q_to_toggle:
            q = Question.objects.get_subclass(id=int(q_to_toggle))
            if int(q_to_toggle) in sitting.get_incorrect_questions:
                sitting.remove_incorrect_question(q)
            else:
                sitting.add_incorrect_question(q)

        return self.get(request)

    def get_context_data(self,**kwargs):
        context = super(QuizMarkingDetail,self).get_context_data(**kwargs)
        context['questions'] =\
            context['sitting'].get_questions(with_answers=True)
        return context


class QuizTake(FormView):
    form_class = QuestionForm
    template_name = 'question.html'
    result_template_name = 'result.html'
    single_complete_template_name = 'single_complete.html'

    def dispatch(self,**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

        try:
            self.logged_in_user = self.request.user.is_authenticated()
        except TypeError:
            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,self.single_complete_template_name)

        return super(QuizTake,self).dispatch(request,**kwargs)

    def get_form(self,**kwargs):
        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
        else:
            form_class = self.form_class

        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,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:
            self.prevIoUs = {}

        self.sitting.add_user_answer(self.question,guess)
        self.sitting.remove_first_question()

    def final_result_user(self):
        results = {
            'quiz': self.quiz,'score': self.sitting.get_current_score,'max_score': self.sitting.get_max_score,'percent': self.sitting.get_percent_correct,'sitting': self.sitting,'prevIoUs': self.prevIoUs,}

        self.sitting.mark_quiz_complete()

        if self.quiz.answers_at_end:
            results['questions'] =\
                self.sitting.get_questions(with_answers=True)
            results['incorrect_questions'] =\
                self.sitting.get_incorrect_questions

        if self.quiz.exam_paper is False:
            self.sitting.delete()

        return render(self.request,self.result_template_name,results)

    def anon_load_sitting(self):
        if self.quiz.single_attempt is True:
            return False

        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):
        """
        Sets the session variables when starting a quiz for the first time
        as a non signed-in user
        """
        self.request.session.set_expiry(259200)  # expires after 3 days
        questions = self.quiz.get_questions()
        question_list = [question.id for question in questions]

        if self.quiz.random_order is True:
            random.shuffle(question_list)

        if self.quiz.max_questions and (self.quiz.max_questions
                                        < len(question_list)):
            question_list = question_list[:self.quiz.max_questions]

        # session score for anon users
        self.request.session[self.quiz.anon_score_id()] = 0

        # session list of questions
        self.request.session[self.quiz.anon_q_list()] = question_list

        # session list of question order and incorrect questions
        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']
        is_correct = self.question.check_if_correct(guess)

        if is_correct:
            self.request.session[self.quiz.anon_score_id()] += 1
            anon_session_score(self.request.session,1)
        else:
            anon_session_score(self.request.session,1)
            self.request\
                .session[self.quiz.anon_q_data()]['incorrect_questions']\
                .append(self.question.id)

        self.prevIoUs = {}
        if self.quiz.answers_at_end is not True:
            self.prevIoUs = {'prevIoUs_answer': guess,'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']
        max_score = len(q_order)
        percent = int(round((float(score) / max_score) * 100))
        session,session_possible = anon_session_score(self.request.session)
        if score is 0:
            score = "0"

        results = {
            'score': score,'max_score': max_score,'percent': percent,'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):
    """
    Returns the session score for non-signed in users.
    If number passed in then add this to the running total and
    return session score.

    examples:
        anon_session_score(1,1) will add 1 out of a possible 1
        anon_session_score(0,2) will add 0 out of a possible 2
        x,y = anon_session_score() will return the session score
                                    without modification

    Left this as an individual function for unit testing
    """
    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"]

enter image description here

当我对etBox / templates / base.html进行更改时,我的更改将反映在所有测验HTML中。

解决方法

我只是快速浏览了一下,在views.py中似乎他只是在使用通用视图,这就是为什么他从不直接调用render函数。

因此,如您在urls.py中看到的那样,该主页与views.py中的QuizListView关联。QuizListView继承自django.views.generic.ListView

如果您查看文档,将会看到默认模板名称是您指定的模型名称+'_list'

class QuizListView(ListView):
model = Quiz

def get_queryset(self):
    queryset = super(QuizListView,self).get_queryset()
    return queryset.filter(draft=False)

此模板位于以下路径中:django_quiz / quiz / templates / quiz / quiz_list.html

对其进行编辑,并且刷新页面时所做的更改应反映在浏览器中

,

这是您的链接和模板应该如何链接的:

  • 您首先在应用目录文件夹中的urls.py文件中创建一个网址:

    """Defines the URL patterns for app created within django"""
    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
       # Home page
       url(r'^$',views.index,name='index'),#notice how I mention the function called index within the views.py file
       ...
    ]
    
  • 然后,在与urls.py相同的文件夹中添加一个函数,该函数允许将模型和表单中的信息携带到模板中(但这是可选的)。

    def index(request):
       """Creating a homepage view"""
       return render(request,'#app_name/index.html')
    
  • 在创建.html文件时,请记住,该文件应位于django读取的特定位置。这很可能是您的问题。您的.html文件不在django渲染的正确位置。 这是主项目目录中.html文件的常规文件路径。 #main_directory /#django_app_directory /#templates /#django_app_name_folder / .html_file 。因此,基本上.html文件必须位于与templatesviews.py相同目录下的名为urls.py的文件夹中。在templates文件夹中,创建另一个文件夹,该文件夹与您的应用程序名称文件夹相同。在此应用程序名称文件夹中,您可以放置​​.html文件。