視頻教程上用戶註冊功能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