【问题标题】:How to add multiple slugs into one url path in Django 2.1?如何在 Django 2.1 中将多个 slug 添加到一个 url 路径中?
【发布时间】:2023-03-16 16:16:01
【问题描述】:

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

如您所见,此示例中的 URL 路径包含 3 个 slug。

这些类别有 3 个不同的课程。并且 slug 分别包含在它们中。为了能够实现这种类型的 URL 路径,我需要做什么?我可以使用单个 slug 来创建 URL 路径,但不能使用多个 slug。

我们非常感谢每一个帮助或想法。我找不到任何来源。

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

VIEWS.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)

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

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

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

    我在我的项目中使用了它,它工作得很好。 有关如何在会话中存储 slug 的更多详细信息,请使用此链接: How use session in Django

    如果您需要任何进一步的帮助,请提出并乐意提供帮助。

    【讨论】:

      【解决方案2】:

      DetailView 用于单个 object,因此您不能同时使用 2 个模型。

      试试这样的:

      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
      

      您现在可以在模板中访问objectstudy_levelobject 将保存您的 Programmsearch 数据和 study_level 您的 StudyLevel 数据

      【讨论】:

      • 亲爱的@HenryM,感谢您的支持。但是我不是很理解你的意见。我的 URL 路径中需要有两个来自不同类(但同一个应用程序)的 slug。每个类中的字段都不同。我需要做什么才能使一个 URL 路径中的两个 slug 起作用?
      • 我以为你已经这样做了,但如果 Django 只接受 1 那么你应该能够以str 发送第二个
      • 您的代码不起作用。您对蛞蝓的名称感到困惑,但无论如何它不起作用。请编辑它
      • 我已经向你解释了如何去做。您现在需要制定最终解决方案
      猜你喜欢
      • 2019-02-14
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2018-05-14
      • 1970-01-01
      • 2021-04-05
      • 2014-04-30
      相关资源
      最近更新 更多