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

时间:2018-05-23 11:39:44

标签: django django-views

我很高兴在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'),
]

该文件说你只能通过&#34; pk&#34;或&#34; slug&#34;进入DetailView,但在这里我有两个参数,所以我运气不好。

在这里,仍然有一种优雅的方式来使用基于类的视图吗?

我的回购在这里:https://github.com/jeremy886/DjangoBasics

2 个答案:

答案 0 :(得分:2)

尝试使用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'

答案 1 :(得分:1)

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

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