[英]How to make a login view for django custom user?
我已經使用AbstractUser制作了一個自定義用戶模型,刪除了用戶名並用電子郵件替換了它,並擴展了該模型,嘗試創建超級用戶,它可以工作,並且還通過注冊表單創建了一些用戶,登錄了管理界面,但是當試圖為失敗的用戶創建登錄表單
我嘗試了這個,但是沒有用
def LoginView(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request,user)
return redirect('accounts:login')
else:
form = AuthenticationForm()
return render(request,'accounts/login.html', {'form':form})
然后我嘗試了這個
class LoginView(FormView):
form_class = AuthenticationForm
template_name = 'login.html'
def form_valid(self, form):
email = form.cleaned_data['email']
password = form.cleaned_data['password']
user = authenticate(email=email, password=password)
# Check here if the user is an admin
if user is not None and user.is_active:
login(self.request, user)
return HttpResponseRedirect(self.success_url)
else:
return self.form_invalid(form)
顯然,我希望用戶能夠登錄,因為我認為此帖子中的代碼格式錯誤。 主要是我的錯,因為我是這個平台的新手
如果您可以發布錯誤消息,那么您將獲得第一條錯誤消息。 表單,視圖或登錄功能可能有問題...
我已經開發了幾乎與您描述的設置相同的設置(我沒有刪除用戶名字段,只是停止使用它)。 如果您還沒有看到它,請訪問https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#substituting-a-custom-user-model上的 Django文檔。
為了正確運行,有一些重要的事情需要正確設置。
USERNAME_FIELD
應該設置為電子郵件字段的名稱。 AUTH_USER_MODEL
需要指向您的自定義用戶模型。 class MyUser(AbstractUser):
USERNAME_FIELD = 'email'
AUTH_USER_MODEL = 'customauth.MyUser'
由於您已經完全刪除了用戶名字段,因此您可能需要將django.contrib.auth.forms.AuthenticationForm
和django.contrib.auth.views.LoginView
子類化,以避免造成django.contrib.auth.views.LoginView
,但是Django應該很好地處理其他身份驗證字段。
如果您確實需要繼承視圖的子類,則https://ccbv.co.uk/projects/Django/2.2/django.contrib.auth.views/LoginView/是查看所有方法以查看內容的好地方繼續。
編輯-關於子類化,這是必要的
我說的可能需要繼承某些東西的說法受到https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#writing-a-manager-for-a-custom-user-model的影響。 我不確定身份驗證系統是否還有其他部分需要您自定義,因為您刪除了用戶名字段。
我已經閱讀了Django身份驗證系統的一些源代碼。 這是要遵循的路徑。
當對Django的身份驗證視圖發出POST請求時,身份驗證表單即被驗證。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/forms.py#L191
驗證函數被調用。 這會遍歷設置的后端,並嘗試對每個后端進行身份驗證。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/__init__.py#L62
Django的內置身份驗證后端會使用自然鍵來獲取用戶(如果存在)。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/backends.py#L16
我們可以在基本管理器中看到,使用的自然鍵是USERNAME_FIELD
命名的字段。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/base_user.py#L43
如果該表單有效,則意味着該用戶已通過正確的身份驗證,然后登錄該用戶。https://github.com/django/django/blob/2.2.2/django/contrib/auth/views.py#L88
我的反應是,Django應該適合您的用例。 您不需要編寫后端。 這是我的直覺告訴您必須編寫的代碼范圍。
from django.contrib.auth import views as auth_views
from django.shortcuts import resolve_url
class LoginView(auth_views.LoginView):
template_name = 'accounts/login.html'
def get_success_url(self):
return resolve_url('accounts:login')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.