2016-04-11 10 views
0

Ich habe Probleme mit dem Django Tutorial ... Ich bekomme einen Incomplete format Fehler von einer meiner Vorlagen, aber ich finde nichts speziell falsch.Django Tutorial: Unvollständiger Formatfehler

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/polls/1/ 

Django Version: 1.9.5 
Python Version: 3.5.1 
Installed Applications: 
['polls.apps.PollsConfig', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles'] 
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.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 


Template error: 
In template C:\Users\Monte Milanuk\Desktop\mysite2\templates\polls\detail.html, error at line 7 
    incomplete format 1 : <h1>{{ question.question_text }}</h1> 
    2 : 
    3 : {% if error_message %} 
    4 :  <p><strong>{{ error_message }}</strong></p> 
    5 : {% endif %} 
    6 : 
    7 : <form action=" {% url 'polls:vote' question.id %} " method="post"> 
    8 :  {% csrf_token %} 
    9 :  {% for choice in question.choice_set.all %} 
    10 :   <input type="radio" name="choice" id="choice{{ forloop.counter }}" 
    11 :    value="{{ choice.id }}" /> 
    12 :   <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br/> 
    13 :  {% endfor %} 
    14 : 
    15 : <input type="submit" value="Vote" /> 
    16 : </form> 
    17 : 

Traceback: 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\core\handlers\base.py" in get_response 
    149.      response = self.process_exception_by_middleware(e, request) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\core\handlers\base.py" in get_response 
    147.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "C:\Users\Monte Milanuk\Desktop\mysite2\polls\views.py" in detail 
    17.  return render(request, 'polls/detail.html', {'question': question}) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\shortcuts.py" in render 
    67.    template_name, context, request=request, using=using) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\template\loader.py" in render_to_string 
    97.   return template.render(context, request) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\template\backends\django.py" in render 
    95.    return self.template.render(context) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\template\base.py" in render 
    206.      return self._render(context) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\template\base.py" in _render 
    197.   return self.nodelist.render(context) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\template\base.py" in render 
    992.     bit = node.render_annotated(context) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\template\base.py" in render_annotated 
    959.    return self.render(context) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\template\defaulttags.py" in render 
    499.    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\core\urlresolvers.py" in reverse 
    600.  return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))) 

File "C:\Users\Monte Milanuk\Anaconda3\envs\django\lib\site-packages\django\core\urlresolvers.py" in _reverse_with_prefix 
    488.     if re.search('^%s%s' % (re.escape(_prefix), pattern), candidate_pat % candidate_subs, re.UNICODE): 

Exception Type: ValueError at /polls/1/ 
Exception Value: incomplete format 

polls\urls.py

from django.conf.urls import url 

from . import views 

app_name = 'polls' 
urlpatterns = [ 
    # ex: /polls/ 
    url(r'^$', views.index, name='index'), 

    # ex: /polls/5 
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), 

    # ex: /polls/5/results/ 
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), 

    # ex: /polls/5/vote/ 
    url(r'^(?P<question_id>[0-9]+)/vote/%$', views.vote, name='vote'), 
] 

views.py

from django.shortcuts import get_object_or_404, render 
from django.http import HttpResponse, HttpResponseRedirect 
from django.core.urlresolvers import reverse 

from .models import Choice, Question 


# Create your views here. 
def index(request): 
    latest_question_list = Question.objects.order_by('-pub_date')[:5] 
    context = {'latest_question_list': latest_question_list} 
    return render(request, 'polls/index.html', context) 


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


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


def vote(request, question_id): 
    question = get_object_or_404(Question, pk=question_id) 
    try: 
     selected_choice = question.choice_set.get(pk=request.POST['choice']) 
    except (KeyError, Choice.DoesNotExist): 
     # Redisplay the question voting form. 
     return render(request, 'polls/detail.html', 
         {'question': question, 
         'error_message': "You didn't select a choice.", 
         }) 
    else: 
     selected_choice.votes += 1 
     selected_choice.save() 
     # Always return an HttpResponseRedirect after successfully dealing with 
     # POST data. This prevent data from being posted twice if a user hits 
     # the Back button. 
     return HttpResponseRedirect(
      reverse('polls:results', args=(question.id,))) 

Gibt es irgendwo sonst in meinem Code, den ich für die Quelle dieses Fehlers suchen sollte?

+0

Bitte zeigen Sie Ihre URL-Muster. – Alasdair

+0

Sie sollten ein [mcve] erstellen. – Sayse

+0

@Sayse Wirklich. Wie siehst du das mit der Anzahl der Dateien, die an einem Django-Projekt beteiligt sind? – memilanuk

Antwort

4

Die % in diesem URL-Muster verursacht den Fehler. Entfernen Sie es.

url(r'^(?P<question_id>[0-9]+)/vote/%$', views.vote, name='vote'), 
+0

Danke! Wenn es Ihnen nichts ausmacht, mich zu fragen, wie beeinflusst ein '%' im Urlmuster für 'vote' die Ansicht für 'detail'? Und warum so eine obskure Fehlermeldung? – memilanuk

+1

Ich stimme zu, es ist ein schwieriger zu debuggen, weil die Fehlerseite die Vorlage zeigt, aber das Problem ist in der 'urls.py'. Da das Problem mit dem Tag "{% url%}" und dem Trace-Back "reverse" erwähnt wird, ist es eine gute Idee, sich die URLs anzusehen. In Python '' '' Zeichen werden für die Formatierung von Zeichenfolgen verwendet, z. '" Mein Name ist% s "% name'. Das Prozentzeichen selbst verursacht den "unvollständigen Formatfehler". – Alasdair

+0

Gut zu wissen; danke für die Tipps. – memilanuk

Verwandte Themen