django检查模型是否存在并将其返回到views.py

时间:2016-12-11 00:14:35

标签: django django-forms django-views

我是django的新手,我有以下问题。

我的模型中有一些用户"用户"它有一个电子邮件和一个用户名字段。我在forms.py中创建了一个LoginFrom,它只接受一个电子邮件地址并检查它是否存在于User数据库中。然后我想返回我的views.py并检索该模型并使用它。

很简单,但我不能这样做

return email_get

在我的forms.py中,因为它说用户已经存在。我可以回到views.py的唯一方法是更改​​我收到的表单电子邮件。

类似的东西,

email_got="found@gmail.com" 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)

非常感谢你的帮助!!

1 个答案:

答案 0 :(得分: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)