Skip to content

Instantly share code, notes, and snippets.

@sleekslush
Created January 21, 2012 01:01
Show Gist options
  • Save sleekslush/1650547 to your computer and use it in GitHub Desktop.
Save sleekslush/1650547 to your computer and use it in GitHub Desktop.
Slug field name example with DetailView
# urls.py
urlpatterns = patterns('',
url(r'^something/(?P<slug>\d+)/$', MyView.as_view()),
)
# views.py
class MyView(DetailView):
slug_field = 'my_cool_field'
@sleekslush
Copy link
Author

Whoops, meant to make the named regex be ?P<slug>

@dnoyes
Copy link

dnoyes commented Jan 21, 2012

# teams/urls.py

(r'^(?P<team_slug>[\w-]+)/*$', DetailView.as_view(model=Team,
        queryset=Team.objects.filter(slug=team_slug)[0]))

I'm not sure how to tell it to use the team_slug token in the path.

@sleekslush
Copy link
Author

All you should need is this in your example, as long as your Team model has a column named slug.

(r'^(?P<slug>[\w-]+)/*$', DetailView.as_view(model=Team))

@dnoyes
Copy link

dnoyes commented Jan 21, 2012

Aha! Okay. That makes perfect sense. Django docs are pretty great, but I was having trouble finding documentation on DetailView.

I didn't realize at first that slug_field was a keyword param for DetailView, and slug or pk needs to be present in the regex.

Since my model has a field literally named slug (as in, "the url-slug-ified version of the team name"), your followup comment is exactly what I needed.

@dnoyes
Copy link

dnoyes commented Jan 21, 2012

So the URL will look like:

/teams/team-awesome-pants

And I needed to take team-awesome-pants and query against the slug field of my Team model (which is NOT the primary key).

It's all comin' together now and starting to make sense. ;)

@sleekslush
Copy link
Author

Yep, you got it 🤘 Yeah, with the new class-based views, I find myself looking at the source code a lot. It's pretty simple to follow but let me know if you run into more issues, I've been doing these for a while now

@dnoyes
Copy link

dnoyes commented Jan 21, 2012

Your help is much appreciated. I had a simple view method defined with 2 lines, but I like learning the shortcuts too (even though it's a bit of brain melting upfront).

@sleekslush
Copy link
Author

Yeah, the shortcuts are really just a way to set the class-level variables versus on a per-instance basis. So if you can do it at class-level, it's better. Use instance-level if you have a special case.

@dnoyes
Copy link

dnoyes commented Jan 21, 2012

This is the final version of what I ended up with:

# teams/url.py
from django.conf.urls.defaults import patterns
from teams.views import TeamList, TeamDetail

urlpatterns = patterns('',
    (r'^/?$', TeamList.as_view()),
    (r'^(?P<slug>[\w-]+)/*$', TeamDetail.as_view()),


# views.py
from django.views.generic import DetailView, ListView
from teams.models import Team

class TeamList(ListView):
    queryset = Team.objects.order_by('-name')

class TeamDetail(DetailView):
    model = Team

@sleekslush
Copy link
Author

If that is the sort order that you use the most, you can make it the default in the model's Meta class 😄 then you don't even need to define a special queryset

@dnoyes
Copy link

dnoyes commented Jan 21, 2012

oooOOOoo. I'm off to try that now. I can be back to needing no code in my view (for now).

@wahabAwudu
Copy link

wahabAwudu commented Jan 1, 2018

how do you invoke the get_absolute_url in the list view?
my model has this get_absolute_url:
def get_absolute_url(self):
return reverse('blog:detail', kwargs= {'slug': self.title})

my urls.py:
url(r'^(?P[-\w]+)/$', PostDetailView.as_view(), name='detail'),

and my views.py:
class PostDetailView(LoginRequiredMixin, DetailView):
model = Post
template_name = 'blog/details.html'
form_class = CommentForm
slug_field = 'title'
slug_url_kwarg = 'slug'

so in the list template, i invoke the get_absolute_url like this:
{{ articles.get_absolute_url }}
and also tried:
{% url 'blog:detail' articles.title %}

it gives the same error as:
NoReverseMatch at /blog/

Reverse for 'detail' with arguments '('Hello Third',)' not found. 1 pattern(s) tried: ['blog/(?P[-\w]+)/$']

pls help me, guys

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment