Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

Python Django Basics Final Details Article detail view

What's the correct way to handle bad PKs?

I tried putting everything in a single line:

article = get_object_or_404(articles, pk=pk)

But it didn't work either.

articles/views.py
from django.shortcuts import render, get_object_or_404

from .models import Article, Writer


def article_list(request):
    articles = Article.objects.all()
    return render(request, 'articles/article_list.html', {'articles': articles})


def writer_detail(request, pk):
    writer = Writer.objects.get(pk=pk)
    return render(request, 'articles/writer_detail.html', {'writer': writer})

def article_detail(request, pk):
    try:
        article = Article.objects.get(pk=pk)
    except:
        article = get_object_or_404(article, pk=pk)
    return render(request, 'articles/article_detail.html', {'article': article})
articles/urls.py
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'writer/(?P<pk>\d+)/$', views.writer_detail),
    url(r'article/(?P<pk>\d+)/$', views.article_detail),
    url(r'', views.article_list),
]

1 Answer

Ryan Ruscett
Ryan Ruscett
23,307 Points

A PK is like an ID that you can query results on based on some index within the model or database for intensive purposes.

pk=3 implies an ID of 3. So i can query results and get just the 3rd ID or index.

Now say my table only has 2 columns and I say PK=3. It will fail with things like list integer out of range. The best way to handle these is to catch the object class exceptions or since models are objects. you could try and catch ObjectDoesNotExist and a whole slew of other ones.. You can of course check for specifics in the documentation but unless you have a really large performance intensive project. No real need to worry about catching specific errors. Just catch em all.