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.

Aldo Rivadeneira
3,241 PointsWhy 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!
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})
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
Treehouse Moderator 27,768 PointsAldo, 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.")