Django 为什么基于FormView(CBV)的视图在上下文中没有URL参数?

Django 为什么基于FormView(CBV)的视图在上下文中没有URL参数?,django,Django,我有一个基于类的视图,需要接受表单提交。我试图使用URL路径中的主键(例如/main/video/play/135)自动填充一些表单字段。基于类的视图是基于FormView的,如果我使用TemplateView,我的代码使pk在上下文中可用,但这对于处理表单不是特别好 url.py app_name = 'main' urlpatterns = [ #path('', views.index, name='index'), path('video/<int:pk>',

我有一个基于类的视图,需要接受表单提交。我试图使用URL路径中的主键(例如/main/video/play/135)自动填充一些表单字段。基于类的视图是基于FormView的,如果我使用TemplateView,我的代码使pk在上下文中可用,但这对于处理表单不是特别好

url.py

app_name = 'main'
urlpatterns = [
    #path('', views.index, name='index'),
    path('video/<int:pk>', views.VideoDetailView.as_view(), name='detail'),
    path('video/preview/<int:pk>', views.VideoPreview.as_view(), name='preview'),
    path('player', views.PlayerListView.as_view(), name='player_list'),
    path('video/play/<int:pk>/', views.VideoPlayView.as_view(), name='play'),
    path('', views.VideoListView.as_view(), name="video_list")
]
我在该行中得到一个键错误:

video = Video.objects.get(context['pk'])
查看错误页面上的调试信息表明上下文中没有存储pk值

如果我使用FormMixin将基类更改为TemplateView,我不会得到这个关键错误(但我确实在发布表单数据时遇到问题),因此我知道代码基本上是可以的。我的理解是FormView类应该以与TemplateView类相同的方式填充上下文


你知道为什么FormView会这样做吗?我如何才能让它工作?

如果你想从URL中获得
pk
,那么
self.kwargs['pk']
将在所有基于Django泛型类的视图中工作


TemplateView
中,该方法将
kwargs
传递给
get\u context\u data
方法,因此您可以使用
context['pk']
FormView
方法调用
get\u context\u data()
,而不传递任何kwargs,因此这将不起作用。

如果您想从URL获得
pk
self.kwargs['pk']
将在所有基于Django泛型类的视图中工作


TemplateView
中,该方法将
kwargs
传递给
get\u context\u data
方法,因此您可以使用
context['pk']
FormView
方法调用
get_context_data()
,但不传递任何kwargs,因此无法工作。

谢谢,我在
get_initial
dispatch
get_context_data
方法中尝试了
self.kwargs['pk']
get_context_data
方法,似乎在所有这些方法中都能正常工作。在我看来,FormView的
get()
方法没有通过任何kwargs,而TemplateView的却通过了,这似乎很奇怪,你知道这背后的原因吗?我认为
TemplateView.get()
是唯一的方法,而不是
FormView.get()
-例如
ListView.get()
DetailView.get())
不要将任何
**kwargs
传递到
获取上下文数据
。我不知道为什么
TemplateView
会这样做,但确实如此。如果你真的很好奇,你可以在代码上运行
git bull
,查看相关的提交和票据。在视图本身中,我始终坚持使用
self.kwargs['pk']
,因为这在所有基于类的通用视图中都有效。谢谢,我在
get_initial
dispatch
get\u context\u data
方法中尝试了
self.kwargs['pk']
,似乎在所有这些方法中都很好。在我看来,FormView的
get()
方法没有通过任何kwargs,而TemplateView的却通过了,这似乎很奇怪,你知道这背后的原因吗?我认为
TemplateView.get()
是唯一的方法,而不是
FormView.get()
-例如
ListView.get()
DetailView.get())
不要将任何
**kwargs
传递到
获取上下文数据
。我不知道为什么
TemplateView
会这样做,但确实如此。如果你真的很好奇,你可以在代码上运行
git bull
,查看相关的提交和票据。在视图本身中,我始终坚持使用
self.kwargs['pk']
,因为这在所有基于类的通用视图中都有效。
video = Video.objects.get(context['pk'])