【问题标题】:Django View with two Slugs带有两个蛞蝓的 Django 视图
【发布时间】:2019-02-21 09:50:10
【问题描述】:

如何用两个 slug 编写一个 Django 视图?

每个 slug 来自不同的模型。

我想获取 www.example.com/category/slug1/slug2

请提供示例代码。

Views.py

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

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

模型.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)

【问题讨论】:

    标签: python-3.x django-views django-2.0


    【解决方案1】:

    首先,我个人的建议是,你必须有一个良好的 POO PYTHON 基础并熟悉 MVT 架构,Django 的架构与 MVC 模型视图控制器非常相似,现在在 View 中它包含了所有逻辑部分python,我们将在哪里声明,或者我们是否要在哪个模板中结束,我们将绘制由 VIEW-Server 处理的数据。

    嗯,首先你想如何使用这 2 个模型,我们要做的是:

    我们导入以下方法

    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})
    

    最后只需在你放置这个的 url 中:

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

    【讨论】:

    • 亲爱的@jpozzo,感谢您的解决方案。但是,蛞蝓来自不同的型号。
    【解决方案2】:

    完美,然后向寺庙发送一个更复杂的字典,带有 2 个键:

    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})
    

    【讨论】:

    • 亲爱的@jpozzo,非常感谢您的帮助。它有效,但现在,当我在数据库中有 Programmesearch 文件时,我收到 NoReverseMatch 错误。 错误: NoReverseMatch at / Reverse for 'subject-detail' with arguments '('corporate-财务', '')' 未找到。尝试了 1 种模式:['study/(?P[-a-zA-Z0-9_]+)/(?P[-a-zA-Z0-9_]+)/$ '] HTML 中的链接: 你好
    【解决方案3】:

    @ulvi-damirli。您可以像这样使用 urls.py

    网址.py

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

    在您的 views.py 中,您可以像这样捕获这些 slug:

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

    希望对你有所帮助,如果成功了请告诉我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2018-04-22
      • 2015-10-23
      • 2018-08-27
      • 2010-09-30
      相关资源
      最近更新 更多