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_field
将 course
字段设置为 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 通用视图:何时使用 ListView 与 DetailView
Django TemplateView 与 DetailView