2016-09-20 55 views
1

我的网站已设置,因此没有用户名(或者user.username = user.email)。如果用户尝试输入已经在数据库中的用户名,Django会出现错误消息,但由于我没有使用用户名进行注册,因此我无法弄清楚如何执行此操作。Django 1.9检查电子邮件已存在

就像现在的默认设置一样,我不想重新加载页面以查明是否有已经与用户关联的电子邮件地址。我的猜测是使用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 %} 
+0

这是一个非常宽泛的问题。这听起来像你有代码在某种程度上工作。确定下一步,尽最大努力解决问题,如果您有更具体的问题,我们可以帮助您。 – dckuehn

+0

我已经添加了我的文件以显示我正在处理的代码。下一步是弄清楚如果用户已经输入了相同的电子邮件地址,或者意外地使用了他人的电子邮件地址,该如何显示用户。 – Lefty

回答

1

您可以覆盖UserForm上的clean_<INSERT_FIELD_HERE>()方法来检查这种特定情况。它会是这个样子:

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的包装。

+1

我认为这是'match = User.objects.get(email = email)'。 –

+0

@GeoffreyR。谢谢,我没有注意到我有一个不同的论点。我已经更新了我的答案。 – tredzko

相关问题