Django:将其转换为 DetailView - 使用来自 URL 的两个参数的视图函数

Posted

技术标签:

【中文标题】Django:将其转换为 DetailView - 使用来自 URL 的两个参数的视图函数【英文标题】:Django: convert this into DetailView - a view function using two parameters from a URL 【发布时间】:2018-11-02 09:22:31 【问题描述】:

我很高兴在 Django 中发现基于类的视图。它更适合我的小脑袋。

现在,我遇到了一种情况,我使用函数视图将用户定向到基于 URL 中的两个参数的页面。

views.py

def step_detail(request, **kwargs):
    course_pk = kwargs["course_pk"]
    step_pk = kwargs["step_pk"]
    step = get_object_or_404(Step, course=course_pk, pk=step_pk)
    return render(request, "courses/step_detail.html", "step": step)

urls.py

urlpatterns = [
    ...
    path("courses/<int:course_pk>/<int:step_pk>/", views.step_detail, name='step'),
]

文档说你只能将“pk”或“slug”传递给 DetailView 但这里我有两个参数所以我不走运。

这里是否还有一种优雅的方式来使用基于类的视图?

我的仓库在这里:https://github.com/jeremy886/DjangoBasics

【问题讨论】:

【参考方案1】:

尝试使用query_pk_and_slug=True 属性。只需使用 slug_fieldcourse 字段设置为 slug:

class StepDetailView(DetailView):

    model = Step
    query_pk_and_slug=True
    slug_field = 'course'
    slug_url_kwarg = 'course_pk'
    pk_url_kwarg = 'step_pk'

【讨论】:

【参考方案2】:

您可以覆盖get_object 以根据您喜欢的任何内容进行查询。

def get_object(self, **kwargs):
    return Step.objects.get(course=course_pk, pk=step_pk)

【讨论】:

这对我来说之前有点高级。现在我看到了它是如何工作的。更简洁的解决方案。

以上是关于Django:将其转换为 DetailView - 使用来自 URL 的两个参数的视图函数的主要内容,如果未能解决你的问题,请参考以下文章

Django - 评级模型示例 DetailView 模板

Django DetailView 动态模型

Django 通用视图:何时使用 ListView 与 DetailView

Django TemplateView 与 DetailView

django DetailView 没有从 ManyToMany 字段中捕获数据

Django - DetailView 中的 DateTimeField