2016-12-11 991 views
0

我對django超級新,並且存在以下問題。django檢查模型是否存在並將其返回到views.py

我有一些用戶在我的模型「用戶」,它有一個電子郵件和用戶名字段。我在我的forms.py中創建了一個LoginFrom,它只接受一個電子郵件地址並檢查它是否存在於用戶數據庫中。然後我想返回到我的views.py並檢索該模型並使用它。

很簡單,但是,我不能在我的forms.py,因爲它說用戶已經存在這樣做

return email_get

。我可以回到views.py的唯一方法是改變我得到的表單電子郵件。

喜歡的東西,

email_got="[email protected]" return email_got

所以,我怎麼能回到通過保持原來的形式電子郵件的forms.py。 Ps,我只是想手動檢查用戶是否存在於數據庫中。

這裏是我的forms.py

from django import forms 
from .models import User 

class LoginForm(forms.ModelForm): 
    class Meta: 
     model=User 
     fields= ['email'] 

    def clean_email(self): 
     email_got = self.cleaned_data.get('email') 

     if User.objects.filter(email=email_got).exists(): 
      raise forms.ValidationError("Your email already exist") 

     return email_got 

我的views.py

from django.conf import settings 
from django.shortcuts import render 
from django.core.mail import send_mail  #for sending mail 
from .forms import SignUpForm, LoginForm 
from .models import User 


def login(request): 
    username = None 
    form=LoginForm(request.POST or None) 

    if form.is_valid(): 
     new_user = form.save() 
     username = getattr(new_user, 'username') 

    context = { 
     "form": form, 
     "username":username, 
    }  

    return render(request,"login.html",context) 

非常感謝您的幫助!

+0

這是你真正的代碼? '如果User.objects.filter(email = emailAt).count()== 1:'會拋出一個錯誤。但是,你又不是在這個代碼所在的地方調用函數。那麼你可以發佈你的真實代碼嗎? – e4c5

+0

@ e4c5多數民衆贊成,我沒有得到任何錯誤,當我嘗試。我的forms.py中唯一缺少的是類SignUpForm。我沒有給出,因爲我會造成不必要的干擾 – user7278236

+0

「你不是在調用這個代碼所在的函數」 – e4c5

回答

0

好的,所以你的isUser「驗證器」實際上並沒有運行。我可以看到你正在對email字段進行自定義驗證,但爲了讓django知道你需要調用isUser函數,必須遵循clean_field_name(self)的命名約定/要求。但是,因爲您只是在進行登錄檢查,您應該檢查電子郵件是否存在於login(request)之內。

所以你forms.py:

from django import forms 
from .models import User 

class LoginForm(forms.ModelForm): 


    class Meta: 
     model=User 
     fields= ['email'] 

你views.py看起來應該是這樣:

from django.conf import settings 
from django.shortcuts import render 
from django.core.mail import send_mail  #for sending mail 
from .forms import SignUpForm, LoginForm 
from .models import User 

def login(request): 
    username = None 
    form=LoginForm(request.POST or None) 

    if form.is_valid(): # This part will just do the typical Django validation (no custom validation added now). 
     existing_user = User.objects.filter(email=form.cleaned_data.get('email')).first() 
     if existing_user: # The email provided exists in db. 
      username = existing_user.username 

     else: # email does not exist so do redirect 
      return redirect('name_of_your_sign_up_view') 


    context = { 
     "form": form, 
     "username":username, 
    }  

    return render(request,"login.html",context) 
+0

Hi @Apoorv,在views.py中,只有在輸入電子郵件是新的時候纔會得到用戶名。但因爲它是我的登錄頁面,所以電子郵件已經在數據庫中。那麼現在,如何在通過驗證後顯示該用戶名呢? 順便說一句,你現有的答案確實幫助我找出了一些其他的東西。謝謝 – user7278236

+0

不用擔心 - 請看我編輯的答案。只是爲了澄清,你基本上想在電子郵件不存在時創建一個新用戶,或者當數據庫中已經存在一個電子郵件(用戶已經存在)時檢索用戶名? –

+0

第二個。如果給定的電子郵件存在,請檢索用戶名。如果不是,則忽略或將它們發送到SignUpView。 @Apoorv – user7278236

相關問題