【问题标题】:django check if model exist and return that to views.pydjango 检查模型是否存在并将其返回给views.py
【发布时间】:2016-12-11 00:14:34
【问题描述】:

我是 django 的超级新手,遇到以下问题。

我的模型“用户”中有一些用户,其中包含电子邮件和用户名字段。我在 forms.py 中创建了一个 LoginFrom,它只接受一个电子邮件地址并检查它是否存在于用户数据库中。然后我想返回到我的 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

还有我的观点.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)

非常感谢您的帮助!

【问题讨论】:

  • 这是您的真实代码吗? if User.objects.filter(email=emailAt).count() == 1: 会抛出错误。但是话又说回来,您没有调用此代码所在的函数。那么你能发布你的真实代码吗?
  • @e4c5 这很奇怪,我尝试时没有收到任何错误。我的 forms.py 中唯一缺少的是 SignUpForm 类。我没有给,因为我会造成不必要的分心
  • "你没有调用这段代码所在的函数"

标签: django django-forms django-views


【解决方案1】:

好的,所以您的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)

【讨论】:

  • 嗨@Apoorv,在views.py 中,只有当输入电子邮件是新的时,您才会获得用户名。但由于这是我的登录页面,电子邮件已经在数据库中。那么现在,在通过验证后,如何显示该用户名?顺便说一句,您现有的答案确实帮助我弄清楚了其他一些事情。谢谢
  • 不用担心 - 请查看我编辑的答案。澄清一下,您基本上想在电子邮件不存在时创建一个新用户,或者在数据库中已经存在电子邮件时检索用户名(用户已经存在)?
  • 第二个。如果给定的电子邮件存在,则检索用户名。如果没有,则忽略它们或将它们发送到 SignUpView。 @Apoorv
  • 哦,我明白这更有意义 - 我回家后会更新我的答案
  • 我试过你的代码,但它不起作用。我发现了2个问题。第一,除了 ValidationError 不运行。第二个可能是第一个错误的原因是,当 form.save() 失败时,form.cleaned_data.get('email') 给我 None
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2016-11-30
  • 2015-06-20
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多