Tuesday, December 10, 2019

Removing Hardcoded urls in Templates

Running Django 3.0 & Python 3.7.3.

 

Issue with Tutorial Part 3:

I replaced "<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>" with
"<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>" and get the following error:
Reverse for 'detail' not found. 'detail' is not a valid view function or pattern name.

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

index.html:

{% if latest_question_list %}

    <ul>

    {% for question in latest_question_list %}

        {% comment %} <li><a href="/polls/{{ question.id }}/">{{ question.id }} {{ question.question_text }} {{ question.pub_date }}</a></li> {% endcomment %}

        <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li> {% comment %} - Why doesn't this work?-->  {% endcomment %}

    {% endfor %}

    </ul>

{% else %}

    <p>No polls are available.</p>

{% endif %}

urls.py:

from os import \

    path

 

from django.urls import \

    path

from . import \

    views

 

app_name = 'polls'

urlpatterns = [

    path('', views.index, name='index'),

    path('<int:question_id>/', views.detail, name='detail'),

    path('<int:question_id>/results/', views.results, name='results'),

    path('<int:question_id>/vote/', views.vote, name='vote'),

]

views.py:

from django.shortcuts import get_object_or_404, render

from django.http import \

    HttpResponse

from django.shortcuts import \

    render

#from django.template import loader

from .models import Question

 

# Create your views here.

def index(request):

    latest_question_list = Question.objects.order_by('-pub_date')[:10]

    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):

    response = "You're looking at the results of question %s."

    return HttpResponse(response % question_id)

 

def vote(request, question_id):

    return HttpResponse("You're voting on question %s." % question_id)

 

Much obliged,
 

 

 

Bruckner de Villiers

083 625 1086

No comments:

Post a Comment