【问题标题】:Django 1.9 check if email already existsDjango 1.9 检查电子邮件是否已经存在
【发布时间】:2017-01-28 18:33:26
【问题描述】:

我的站点设置为没有用户名(或者更确切地说是 user.username = user.email)。如果用户尝试输入数据库中已经存在的用户名,Django 会出现错误消息,但是由于我没有使用用户名进行注册,所以我无法弄清楚如何执行此操作。

就像默认设置一样,我不想重新加载页面来查看是否有一个电子邮件地址已经与用户关联。我的猜测是使用 Ajax,但我不知道该怎么做。我看过其他帖子,但最近似乎没有任何内容。

我如何检查一个电子邮件地址是否已经存在,如果存在,给一个错误信息让用户输入一个新的电子邮件地址?

models.py:

class MyUsers(models.Model):
    user = models.OneToOneField(User)
    first_name = models.CharField(max_length=100, blank=True)
    last_name = models.CharField(max_length=100, blank=True)
    email = models.EmailField(max_length=100, blank=True, unique=True)
    company = models.CharField(max_length=100, blank=True, null=True)
    website = models.URLField(max_length=100, blank=True, null=True)
    phone_number = models.CharField(max_length=100, blank=True, null=True)

    def __str__(self):
        return self.user.username

forms.py:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email',)


class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('first_name', 'last_name', 'company', 'website', 'phone_number')

views.py:

def index(request):
    registered = False

    if request.method == 'POST':
        user_form = UserForm(data=request.POST)
        profile_form = UserProfileForm(data=request.POST)

        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()
            user.set_password(user.password)
            user.password = ""
            user.username = user.email
            user.save()

            profile = profile_form.save(commit=False)
            profile.user = user
            profile.email = user.email
            profile.save()

            user.first_name = profile.first_name
            user.last_name = profile.last_name
            user.save()

            registered = True
            return HttpResponseRedirect(reverse('registration'))
        else:
            print user_form.errors, profile_form.errors
    else:
        user_form = UserForm()
        profile_form = UserProfileForm1()

    context = {'user_form': user_form, 'profile_form': profile_form, 'registered': registered}
    return render(request, 'mysite/register.html', context)

register.html:

{% extends 'mysite/base.html' %}
{% load staticfiles %}

{% block title_block %}
    Register
{% endblock %}

{% block head_block %}
{% endblock %}

{% block body_block %}    
    <form id="user_form" method="post" action="/mysite/" enctype="multipart/form-data">
        {% csrf_token %}
        {{ user_form.as_p }}
        {{ profile_form.as_p }}

        <input type="submit" name="submit" value="Register" />
    </form>
{% endblock %}

【问题讨论】:

  • 这是一个非常广泛的问题。听起来您确实有代码在某种程度上工作。确定下一步,尽力解决,如果您有更具体的问题,我们或许可以为您提供帮助。
  • 我已添加文件以显示我正在处理的代码。下一步是弄清楚如何向用户展示他们是否已经输入了相同的电子邮件地址,或者不小心使用了其他人的电子邮件地址。

标签: python ajax django django-forms django-templates


【解决方案1】:

您可以覆盖UserForm 上的clean_&lt;INSERT_FIELD_HERE&gt;() 方法来检查这种特殊情况。它看起来像这样:

forms.py:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email',)

    def clean_email(self):
        # Get the email
        email = self.cleaned_data.get('email')

        # Check to see if any users already exist with this email as a username.
        try:
            match = User.objects.get(email=email)
        except User.DoesNotExist:
            # Unable to find a user, this is fine
            return email

        # A user was found with this as a username, raise an error.
        raise forms.ValidationError('This email address is already in use.')

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('first_name', 'last_name', 'company', 'website', 'phone_number')

您可以在Django documentation 关于表单中阅读有关清理表单中特定字段的更多信息。

也就是说,我认为您应该考虑创建一个 custom user model 而不是将您的 User Profile 类视为 User 的包装器。

【讨论】:

  • 我认为这更像是match = User.objects.get(email=email)
  • @GeoffreyR。谢谢,我没有注意到我有不同的论点。我已经更新了我的答案。
  • @tredzko 我使用用户名作为登录凭据,现在在更新配置文件时,它会抛出电子邮件已存在错误。如何解决?
  • @UditHariVashisht 检查您是否正在更新。你可以看看有没有实例。如果有实例,可以对比传入的邮箱和实例上的邮箱,只检查是否不同。另一种选择是使用排除电子邮件字段的其他表单,除非更改电子邮件是所需的效果。
  • @tredzko 我已经在使用两种表单(个人资料和用户表单)我的问题是,如果我只更新名字而不是电子邮件,那么它也会给出电子邮件已经存在的错误。 request.user 可以使用,但我不确定在哪里使用它。尝试了各种组合,但都没有成功。
猜你喜欢
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
相关资源
最近更新 更多