2017-08-21 173 views
0

我得到了一個錯誤, TemplateDoesNotExist在/ polls/1/ templates/polls/detail.html。我想顯示detail.html。TemplateDoesNotExist at/polls/1/

回溯是

Traceback: 

File "/Users/XXX/django/django/core/handlers/exception.py" in inner 
    35.    response = get_response(request) 

File "/Users/XXX/django/django/core/handlers/base.py" in _get_response 
    130.     response = self.process_exception_by_middleware(e, request) 

File "/Users/XXX/django/django/core/handlers/base.py" in _get_response 
    128.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/XXX/djangostudy/polls/views.py" in detail 
    43.   'question': obj, 

File "/Users/XXX/django/django/shortcuts.py" in render 
    36.  content = loader.render_to_string(template_name, context, request, using=using) 

File "/Users/XXX/django/django/template/loader.py" in render_to_string 
    61.   template = get_template(template_name, using=using) 

File "/Users/XXX/django/django/template/loader.py" in get_template 
    19.  raise TemplateDoesNotExist(template_name, chain=chain) 

Exception Type: TemplateDoesNotExist at /polls/1/ 
Exception Value: templates/polls/detail.html 

我forms.py就像是單選按鈕的

from django import forms 

class MyForm(forms.Form): 
    text = forms.CharField(max_length=100,required=False,label='テキスト') 

class VoteForm(forms.Form): 
    choice = forms.ModelChoiceField(
     queryset=None, 
     label='選択', 
     widget=forms.RadioSelect, 
     empty_label=None, 
     error_messages={ 
      'required':"You didn't select a choice.", 
      'invalid_choice':"invalid choice.", 
     }, 
    ) 

    def __init__(self,question,*args,**kwargs): 
     super().__init__(*args,**kwargs) 
     self.fields['choice'].queryset = question.choice_set.all() 

設置是寫在detail.html,像

<!DOCTYPE html> 
<h1>{{ question.question_text }}</h1> 
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} 

<form action="{% url 'poll_vote' question.id %}" method="post"> 
<!--<form action="" method="post">--> 
    {% csrf_token %} 
    {% for choice in question.choice_set.all %} 
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" /> 
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br /> 
    {% endfor %} 
    <!--{{ form }}--> 
    <input type="submit" value="Vote" /> 
</form> 
</html> 

views.py是

from django.shortcuts import render 
from django.utils.html import mark_safe 
from .models import Question 
from django.http import HttpResponse 
from django.shortcuts import Http404 
from django.shortcuts import get_object_or_404,redirect 
from .models import Choice 
from django.views.generic import TemplateView 
from django.views.generic import DetailView 
from django.views.generic import ListView 
from .forms import MyForm 
from .forms import VoteForm 


# Create your views here. 
def index(request): 
    return render(request,'polls/index.html',{ 
     'questions': Question.objects.all(), 
    }) 

def detail(request,pk): 
    obj = get_object_or_404(Question,pk=pk) 
    if request.method == "POST": 
     form = VoteForm(question=obj,data=request.POST) 
     if form.is_valid(): 
      return redirect('polls:results',pk) 
    else: 
     form = VoteForm(question=obj) 
    return render(request,'templates/polls/detail.html',{ 
     'form':form, 
     'question': obj, 
    }) 

def vote(request,pk): 
    pass 

def results(request,pk): 
    obj = get_object_or_404(Question,pk=pk) 
    return render(request,'polls/results.html',{ 
     'question':obj, 
    }) 

def form_test(request): 
    if request.method == "POST": 
     #request.POST??? 
     form = MyForm(data=request.POST) 
     if form.is_valid(): 
      pass 
    else: 
     form = MyForm() 
    return render(request,'polls/form.html',{ 
     'form':form, 
    }) 

我想裝模板的地方,這是detail.html

return render(request,'templates/polls/detail.html',{ 
     'form':form, 
     'question': obj, 
    }) 

,所以我不明白爲什麼不顯示我detail.html可以here.How解決這一問題?

回答

1

您正在告訴Django使用templates/polls/detail.html。這意味着Django會尋找polls/templates/templates/polls/detail.html,這可能不是你想要的。

你還沒有說你的模板在哪裏,但我假設它在polls/templates/polls/detail.html。在這種情況下,你應該改變視圖:

return render(request,'polls/detail.html', { 
    'form':form, 
    'question': obj, 
}) 
+0

THX,我的網站工作的正確!但我不明白爲什麼改變「模板/調查/ detail.html」到「民意測驗/ detail.html」可以修復錯誤。爲什麼? – mikimiki

+0

Django在你的'polls/templates /'文件夾中搜索模板。當你使用'templates/polls/detail.html'時,Django會查找不存在的'polls/templates/templates/polls/detail.html'。你不在任何其他視圖中包含'templates',所以你不應該爲這個。 – Alasdair

+0

想象一下,您必須在您的'polls/templates /'中搜索'templates/polls/detail.html',您的'polls/templates'中沒有任何名爲'templates'的文件夾,對嗎? 您不必指定'templates',因爲django知道,但是您必須指定'polls'作爲名稱空間,這樣django就知道這些模板是用於'polls'的。 – ShadowXsc