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

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 27,768 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.")