代码之家  ›  专栏  ›  技术社区  ›  Ulvi

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

  •  1
  • Ulvi  · 技术社区  · 6 年前

    我想有一个这样的URL路径: www.example.com/学士/frankfurt-university/corporate-finance

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

    我有三个不同的班级。弹头分别包含在每个弹头内。我需要做什么才能实现这种类型的URL路径?我可以用一个slug创建URL路径,但不能用多个slug。

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

    网址.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'),
        ]
    

    视图.py

    class IndexView(generic.ListView):
        model = Programmesearch
        template_name = 'mnsdirectory/index.html'
        context_object_name = 'universities'
        queryset = Programmesearch.objects.all()[:6]
        def get_context_data(self, **kwargs):
            context = super(IndexView, self).get_context_data(**kwargs)
            context['studylevels'] = StudyLevel.objects.all()[:10]
            return context
    
    class SubjectDetailView(generic.DetailView):
        model = Programmesearch
        template_name = 'mnsdirectory/subject_detail.html'
        slug_field = 'subjectslug'
        slug_url_kwarg = 'subjectslug'
    
    class StudylevelDetailView(generic.DetailView):
        model = StudyLevel
        template_name = 'mnsdirectory/study_level.html'
        slug_field = 'studylevelslug'
        slug_url_kwarg = 'studylevelslug'
    

    模型.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)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ali Akhtari    5 年前

    我也有同样的问题,你可以储存并传递你的第一个子弹 slug:studylevelslug (使用会话或将其另存为模型中的字段)然后将multi-slug传递到url路径,与在代码中所做的相同: path('study/<slug:studylevelslug>/<slug:subjectslug>/', views.SubjectDetailView.as_view(), name='subject-detail'), 在你的模板中 {% url %} 像这样把你的鼻涕虫传过去:

    {% url 'subject-detail' studylevelslug=YOURFIRSTSLUG subjectslug=YOURSECONDSLUG  %}
    

    我在我的项目中用过这个,效果很好。 有关如何在会话中存储slug的详细信息,请使用以下链接: How use session in Django

    如果你需要任何进一步的帮助,请和将乐意帮助。

        2
  •  0
  •   Ulvi    6 年前

    一个 DetailView 是为了一个人 object 所以你不能用两个型号。

    试试这样的:

    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
    

    你现在可以访问 对象 study_level 在你的模板中。 对象 会抓住你的 Programmsearch 数据和 学习水平 你的 StudyLevel 数据