Django View with two Slugs

1.2k Views Asked by At

How to write a Django View with two slugs?

Each slug is from different Models.

I want to get www.example.com/category/slug1/slug2

Please provide an example code.

Views.py

class SubjectDetailView(generic.DetailView, SingleObjectMixin):
    model           = Programmesearch
    template_name   = 'mnsdirectory/subject_detail.html'
    slug_field      = 'subjectslug'
    slug_url_kwarg  = 'subjectslug'

Urls.py

app_name    = 'mnsdirectory'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'), #views.indexSubjectDetailView(View)
    path('study/<slug:subjectslug>/', views.SubjectDetailView.as_view(), name='subject-detail'),
    path('study-abroad/<slug:studylevelslug>/', views.StudylevelDetailView.as_view(), name='studylevel-list'),
    ]

Models.py:

class Programmesearch(models.Model):
    full_subject_name   =   models.CharField(max_length=100, blank=False, null=False)
    subjectslug         =   models.SlugField(unique=True, editable=False, max_length=100)

class StudyLevel(models.Model):
    study_level     = models.CharField(max_length=100, blank=False, null=False)
    studylevelslug  = models.SlugField(unique=True, editable=False, max_length=100)
3

There are 3 best solutions below

1
On

good first that my advice personally is that you have to have a good base of POO PYTHON and know well the MVT architecture, Django works a very similar architecture the MVC model view controller, now in View it goes all the logical part of python and there is where we will declare or whether we are going to end in which Template we are going to paint data processed by VIEW-Server.

Well, first of all how you want to work with those 2 models what we will do is the following:

We import the following methods

from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import View

class SubjectDetailView(View):
    def get(self, request, *args, **kwargs):
        queryset = Programmesearch.objects.all()        
        return render(request, 'mnsdirectory/subject_detail.html', {'element':queryset})

finally simply in the url you place this:

path('study/slug1/slug2/', views.SubjectDetailView.as_view(), name='subject-detail'),
1
On

perfect then send to the temple a dictionary a little more complex with 2 keys:

class SubjectDetailView(View):
    def get(self, request, *args, **kwargs):
        queryset = Programmesearch.objects.all()
        queryset2 = StudyLevel.objects.all()           
        return render(request, 'mnsdirectory/subject_detail.html', {'element':queryset,'element2':queryset2})
0
On

@ulvi-damirli. You can use your urls.py like this:

Urls.py

re_path(r'^(?P<slug>[\w_-]+)/(?P<studylevel>[\w_-]+)/$', 
            views.SubjectDetailView.as_view(), name='subject-detail'),

and in your views.py, you can catch these slugs like this:

Views.py

class SubjectDetailView(generic.DetailView, SingleObjectMixin):
    model           = Programmesearch
    template_name   = 'mnsdirectory/subject_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # subjectslug = self.object.slug # Not necessary since It's a DetailView
        studyLevel = StudyLevel.objects.filter(
                            study_level=self.kwargs.get('studylevel', None))

Hope I helped you, let me know if It worked