How to specify something other than pk or slug for DetailView
Question:
I was wondering if it was possible to use something besides a pk or slug when you are using a DetailView in Django 1.3.
For example, I currently have:
url(r'^mymodel/(?P<pk>d+)/$', MyDetailView.as_view())
as my url. Say I wanted something like:
url(r'^mymodel/(?P<name>d+)/$', MyDetailView.as_view())
where name would be a field in the model. Is there anyway to have the DetailView use that to ‘grab’ the object I want and pass it on to my template?
Answers:
A slug doesn’t have any particular significance in Django. It’s just a name for a field that identifies a row. If your slug is called something else, eg name
, just specify name
as the slug_field
attribute in your view subclass.
If you need something more complicated, you can always override get_object
in the view class.
You can use attribute "pk_url_kwarg"
urls.py
url(r'^mymodel/(?P<name>d+)/$', MyDetailView.as_view())
views.py
class CustomDetailView(LoginRequiredMixin, DetailView):
model = ModelName
pk_url_kwarg = "name" # primary key(to identify object uniquely)
template_name = "template.html"
Reference: https://ccbv.co.uk/projects/Django/4.1/django.views.generic.detail/DetailView/
I was wondering if it was possible to use something besides a pk or slug when you are using a DetailView in Django 1.3.
For example, I currently have:
url(r'^mymodel/(?P<pk>d+)/$', MyDetailView.as_view())
as my url. Say I wanted something like:
url(r'^mymodel/(?P<name>d+)/$', MyDetailView.as_view())
where name would be a field in the model. Is there anyway to have the DetailView use that to ‘grab’ the object I want and pass it on to my template?
A slug doesn’t have any particular significance in Django. It’s just a name for a field that identifies a row. If your slug is called something else, eg name
, just specify name
as the slug_field
attribute in your view subclass.
If you need something more complicated, you can always override get_object
in the view class.
You can use attribute "pk_url_kwarg"
urls.py
url(r'^mymodel/(?P<name>d+)/$', MyDetailView.as_view())
views.py
class CustomDetailView(LoginRequiredMixin, DetailView):
model = ModelName
pk_url_kwarg = "name" # primary key(to identify object uniquely)
template_name = "template.html"