2016-09-20 21 views
1

私のサイトは設定されているので、ユーザ名はありません(あるいはuser.username = user.email)。 Djangoには、ユーザーがすでにデータベースに入っているユーザー名を入力しようとしたときにエラーメッセージが表示されますが、登録にユーザー名を使用していないので、これを行う方法がわかりません。Django 1.9電子メールが既に存在するかどうかを確認してください

既定の設定と同じように、既にユーザーに関連付けられている電子メールアドレスがあるかどうかを調べるために、ページをリロードしたくありません。私の推測はAjaxを使うことですが、どうやってそれを行うのか分かりません。 Iveは他の投稿を見ましたが、最近は何もないようです。

メールアドレスが既に存在するかどうかを確認するにはどうすればよいですか?その場合は、新しいメールアドレスを入力するというエラーメッセージを表示しますか?

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

UserFormclean_<INSERT_FIELD_HERE>()メソッドをオーバーライドして、この特定のケースに対してチェックすることができます。あなたがフォームについてDjango documentationにフォームの特定のフィールドをクリーニングの詳細を読むことができ

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') 

forms.py:それはこのような何かを見てね。

つまり、私はあなたのUser ProfileクラスをUserのラッパーとして扱う代わりに、custom user modelを作成してみるべきだと思います。

+1

これはむしろ 'match = User.objects.get(email = email)'だと思います。 –

+0

@ GeoffreyR。ありがとう、私は別の議論があったことに気付かなかった。私は私の答えを更新しました。 – tredzko

関連する問題