Django 为什么基于FormView(CBV)的视图在上下文中没有URL参数?
我有一个基于类的视图,需要接受表单提交。我试图使用URL路径中的主键(例如/main/video/play/135)自动填充一些表单字段。基于类的视图是基于FormView的,如果我使用TemplateView,我的代码使pk在上下文中可用,但这对于处理表单不是特别好 url.pyDjango 为什么基于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>',
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'])