Reputation: 1021
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)
Upvotes: 1
Views: 1290
Reputation: 77
@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
Upvotes: 0
Reputation: 141
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})
Upvotes: 1
Reputation: 141
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'),
Upvotes: 1