Django: преобразовать это в DetailView - функцию просмотра, используя два параметра из URL - PullRequest
0 голосов
/ 23 мая 2018

Я действительно рад открыть для себя классовые представления в Django.Это лучше подходит моему крошечному мозгу.

Теперь я столкнулся с ситуацией, когда я направлял пользователей на страницу на основе двух параметров из URL-адреса с помощью функции view.

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

В документе говорится, что в DetailView можно передавать только "pk" или "slug", но здесь у меня есть два параметра, поэтому мне не повезло.

Случайно, есть ли еще элегантный способ использовать представления на основе классов?

Мое репо здесь: https://github.com/jeremy886/DjangoBasics

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы можете переопределить get_object для запроса на основе чего угодно.

def get_object(self, **kwargs):
    return Step.objects.get(course=course_pk, pk=step_pk)
0 голосов
/ 23 мая 2018

Попробуйте использовать атрибут query_pk_and_slug=True.Просто установите course поле как слаг, используя slug_field:

class StepDetailView(DetailView):

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