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 trialAldo 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 28,720 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.")