如何在Django 2.1中将多个slug添加到一个url路径中?

如何在Django 2.1中将多个slug添加到一个url路径中?,django,python-3.x,Django,Python 3.x,我希望有如下URL路径: www.example.com/bacher/frankfurt-university/corporate-finance 如您所见,在本例中,URL路径包含3个slug 我有三个不同的类别。而slug则分别包含在它们的内部。我需要做什么才能实现那种类型的URL路径?我可以用一个slug创建URL路径,但不能用多个slug 每一个帮助或想法都受到高度赞赏。我找不到任何来源 url.py app_name = 'mnsdirectory' urlpatterns = [

我希望有如下URL路径: www.example.com/bacher/frankfurt-university/corporate-finance

如您所见,在本例中,URL路径包含3个slug

我有三个不同的类别。而slug则分别包含在它们的内部。我需要做什么才能实现那种类型的URL路径?我可以用一个slug创建URL路径,但不能用多个slug

每一个帮助或想法都受到高度赞赏。我找不到任何来源

url.py

app_name = 'mnsdirectory'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'), #views.index
    path('study/<slug:studylevelslug>/<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):
    study_country = models.CharField(max_length=100, 
        choices=COUNTRY_CHOICE)
    full_subject_name = models.CharField(max_length=100, blank=True, 
        null=True)

    def get_unique_slug(self):
        subjectslug = slugify(self)
        unique_slug = subjectslug
        counter = 1
        while mnsdirectory.objects.filter(subjectslug = unique_slug).exists():
            unique_slug = '{}-{}'.format(subjectslug, counter)
            counter += 1
        return unique_slug

    subjectslug = models.SlugField(unique=True)

    def __str__(self):
        return self.subjectslug

    def get_absolute_url(self):
        return reverse('SubjectDetailView', args=[str(self.id)])

def pre_save_programmesearch_receiver(sender, instance, *args, **kwargs):
    subjectslug = slugify(instance.full_subject_name)
    exists = Programmesearch.objects.filter(subjectslug=subjectslug).exists()
    if exists:
        subjectslug = "%s-%s" %(subjectslug, instance.id)
    instance.subjectslug = subjectslug

pre_save.connect(pre_save_programmesearch_receiver, sender=Programmesearch)

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

    def __str__(self):
        return self.studylevelslug

    def get_absolute_url(self):
        return reverse('StudylevelDetailView', args=[str(self.id)])

    def get_unique_slug(self):
        studylevelslug = slugify(self.study_level)
        unique_slug = studylevelslug
        counter = 1
        while StudyLevel.objects.filter(studylevelslug = unique_slug).exists():
            unique_slug = '{}-{}'.format(studylevelslug, counter)
            counter += 1
        return unique_slug

def pre_save_studylevel_receiver(sender, instance, *args, **kwargs):
    studylevelslug = slugify(instance.study_level)
    exists = StudyLevel.objects.filter(studylevelslug=studylevelslug).exists()
    if exists:
        studylevelslug = "%s-%s" %(studylevelslug, instance.id)
    instance.studylevelslug = studylevelslug

pre_save.connect(pre_save_studylevel_receiver, sender=StudyLevel)

DetailView
用于单个
对象
,因此不能与两个模型一起使用

试着这样做:

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

    def get_study_level(self, *args, **kwargs):
        return StudyLevel.objects.get(slug=subjectslug)

    def get_context_data(self, *args, **kwargs):
        ctx = super().get_context_data(*args, **kwargs)
        ctx['study_level'] = self.get_study_level()
        return ctx

现在,您可以访问模板中的
对象
研究级别
<代码>对象将保存您的
程序搜索
数据和
研究级别
您的
StudyLevel
数据

我也有同样的问题,您可以存储并传递您的第一个slug
slug:studylevelslug
(使用会话或将其保存为模型中的字段)然后将multi-slug传递到url路径,就像在代码中一样:
path('study//',views.SubjectDetailView.as_view(),name='subject-detail'),
在您的模板中,当您调用
{%url%}
时,按如下方式传递slug:

{% url 'subject-detail' studylevelslug=YOURFIRSTSLUG subjectslug=YOURSECONDSLUG  %}
我在我的项目中使用了这个,它工作得非常好。 有关如何在会话中存储slug的更多详细信息,请使用以下链接:


如果您需要任何进一步的帮助,请询问,我们将乐于提供帮助。

亲爱的@HenryM,感谢您的支持。但我不太明白你的意见。我需要在我的URL路径中有两个来自不同类(但相同的应用程序)的slug。每个类中的字段都不同。要使一个URL路径中的两个slug正常工作,我需要做什么?我以为您已经这样做了,但是如果Django只接受1,那么您应该能够以
str
的形式发送第二个slug,因为您的代码无法正常工作。你混淆了鼻涕虫的名字,但不管怎样,它不起作用。请编辑我已经向你解释了怎么做。你现在需要制定出最终的解决方案
{% url 'subject-detail' studylevelslug=YOURFIRSTSLUG subjectslug=YOURSECONDSLUG  %}