Django RegisterPage类代码疑问:方法替换及参数传递问题
Django注册视图代码疑问解答
先看你给出的注册视图代码:
class RegisterPage(FormView): template_name = 'base/register.html' form_class = UserCreationForm redirect_authenticated_user = True success_url = reverse_lazy('tasks') def form_valid( self, form ): user = form.save() if user is not None: login( self.request, user ) return super( RegisterPage, self ).form_valid( form ) def get( self, *args, **kwargs ): if self.request.user.is_authenticated: return redirect('tasks') return super(RegisterPage, self).get(*args, **kwargs)
问题1:能否使用def register( self, form ):替代def form_valid( self, form ):?
不行。form_valid是Django的FormView父类中定义的钩子方法,当表单验证通过后,框架会自动调用这个方法处理后续逻辑(比如跳转成功页)。如果换成自定义的register方法,Django不会识别这个方法名,这段逻辑完全不会被触发。除非你重写dispatch等核心方法手动调用register,但这完全没必要,遵循框架约定用form_valid才是正确做法。
问题2:self和form在此处是如何传递的?
self:Django处理请求时,会先创建RegisterPage视图类的实例,调用类中方法时,会自动把这个实例对象作为第一个参数self传入,你可以通过self访问视图实例的属性(比如self.request请求对象、self.template_name模板路径等)。form:处理POST请求时,FormView会根据你指定的form_class创建表单实例,完成数据验证后,框架会把这个验证通过的表单实例作为参数传给form_valid方法。
问题3:能否使用def save( self, *args, **kwargs ):替代def get( self, *args, **kwargs ):?
完全不行。get是Django视图类中负责处理GET请求的核心方法,用户直接访问注册页面时,Django会调用这个方法返回表单页面。而save通常是表单、模型类的方法,和HTTP请求处理逻辑完全不相关。你重写save方法后,Django处理GET请求时还是会调用父类的get方法,自定义的save根本不会被触发,起不到任何作用。
内容的提问来源于stack exchange,提问作者abu abu
相关产品推荐
相关产品推荐

