Django中EventDeleteView构造函数self.kwargs报错原因咨询
为什么在Django的EventDeleteView构造函数中访问self.kwargs会报错?
先看你给出的代码:
class EventDeleteView(generic.FormView): form_class = EventDeleteForm template_name = 'event/event_delete.html' def __init__(self, **kwargs): super().__init__(**kwargs) self.event = Event.objects.get(pk=self.kwargs['pk']) # 这里会报错 def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['pk'] = self.kwargs['pk'] # 这里正常运行 return kwargs
这个问题的核心在于Django类视图的初始化和请求处理的时序差异:
当你通过
as_view()创建视图实例时,__init__方法会被调用,但这时候Django只是完成了视图类的实例化,还没有处理具体请求,也没把URL中的参数(也就是kwargs)绑定到视图实例的self.kwargs属性上。__init__接收的**kwargs是类初始化参数,并非URL解析后的参数,而且Django不会把这些参数直接赋值给self.kwargs——这个赋值操作是后续请求处理流程中才完成的。而
get_form_kwargs方法是在视图处理请求的阶段(比如用户发起GET/POST请求时)才会被调用。到这个时候,Django已经完成了URL路由解析,把URL中的参数(比如pk)提取出来并赋值给了视图实例的self.kwargs属性,所以在这里访问self.kwargs['pk']完全没问题。
怎么解决初始化时获取Event的需求?
如果你的目的是在视图处理请求前就获取对应的Event对象,别用__init__,可以改用dispatch方法——它是所有请求处理的入口,执行时self.kwargs已经被正确赋值:
class EventDeleteView(generic.FormView): form_class = EventDeleteForm template_name = 'event/event_delete.html' def dispatch(self, request, *args, **kwargs): # 这里可以安全访问self.kwargs self.event = Event.objects.get(pk=self.kwargs['pk']) return super().dispatch(request, *args, **kwargs) def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['pk'] = self.kwargs['pk'] return kwargs
这样修改后,既能提前获取Event对象,又不会触发'EventDeleteView' object has no attribute 'kwargs'的错误。
内容的提问来源于stack exchange,提问作者Aliquis
相关产品推荐
相关产品推荐

