视频教程上用户注册功能view的代码是:
class RegisterView(View): # get方法直接返回页面 def get(self, request): register_form = RegisterForm() # 添加验证码 return render(request, 'register.html', {'register_form': register_form}) def post(self, request): register_form = RegisterForm(request.POST) # 获取验证实例化 if register_form.is_valid(): user_name = request.POST.get('email', '') # 如果用户名已经存在,则提示错误信息 if UserProfile.objects.filter(email=user_name): return render(request, 'register.html', {'register_form': register_form, 'msg': '用户已存在'}) pass_word = request.POST.get('password', '') # 实例化一个user_profile对象,将前台值存入 user_profile = UserProfile() user_profile.username = user_name user_profile.password = pass_word user_profile.is_active = False # 邮箱激活,默认为没有激活 # 对password进行加密并保存 user_profile.password = make_password(pass_word) user_profile.save() # 发送邮件 send_register_email(user_name, 'register') return render(request, 'login.html') # 发送成功后跳转到登录页面 else: # 失败的话重新回到注册页面,重新进行注册 return render(request, 'register.html', {'register_form': register_form})
其中实例化一个user_profile对象,将前台值存入用的是user_profile.username = user_name.如果这样用,邮箱则收不到激活邮件,同时在注册的时候,也无法通过
if UserProfile.objects.filter(email=user_name): return render(request, 'register.html', {'register_form': register_form, 'msg': '用户已存在'})
判断邮箱是否已经注册过了,在users 的app中的表时,采用了覆盖原有表的方法,但是覆盖后,表里面依旧存在username和email两个属性(也有可能是导入的库版本不同,从而出现这种情况),用user_profile.username = user_name时,会把值传入到UserProfile的username属性中,而不是email属性中,所以需要改为user_profile.email= user_name