簡體   English   中英

如何為Django自定義用戶創建登錄視圖?

[英]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.AuthenticationFormdjango.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身份驗證系統的一些源代碼。 這是要遵循的路徑。

  1. 當對Django的身份驗證視圖發出POST請求時,身份驗證表單即被驗證。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/forms.py#L191

  2. 驗證函數被調用。 這會遍歷設置的后端,並嘗試對每個后端進行身份驗證。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/__init__.py#L62

  3. Django的內置身份驗證后端會使用自然鍵來獲取用戶(如果存在)。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/backends.py#L16

  4. 我們可以在基本管理器中看到,使用的自然鍵是USERNAME_FIELD命名的字段。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/base_user.py#L43

  5. 如果該表單有效,則意味着該用戶已通過正確的身份驗證,然后登錄該用戶。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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM