Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Python Django Basics Final Details Article detail view

Aldo Rivadeneira
Aldo Rivadeneira
3,241 Points

Why isn't working the article_detail() ?

Inside views.py i don't understand why is needed to declare like the following:

def article_detail(request, pk):
    article = get_object_or_404(Article, pk=pk)
...

instead like my original code

Thanks for the info!

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

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

Jeff Muday
MOD
Jeff Muday
Treehouse Moderator 28,720 Points

Aldo, that's a great question. Something I was wondering about when I was learning Django. And later when I started writing lots of Flask with the PeeWee ORM, I realized that shortcut was glaringly missing from Flask and coded it up in a utilities module.

The "get_object_or_404" is a handy way to throw the 404 abort message and as you'd expect, there are other good ways to do this too.

The method is part of the django.shortcuts because it is not purely something in the Django Model class but combines Django http methods to raise and present a 404 response.

In the Django documentation they show the code equivalency:

https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/

from django.shortcuts import get_object_or_404

def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)

is equivalent to this:

from django.http import Http404

def my_view(request):
    try:
        obj = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")