2016-04-17 23 views
0

私はユーザーがいて、クラスはゲストで、登録でき、ログインしてプロフィールを更新することができます。今はログインができないので問題があります。私は電子メールがユニークであると設定していると思います。なぜなら、ユーザーのユーザー名だからです。ここでユーザーはdjangoにログインできません

は私model.pyファイルです:

class Guest(models.Model): 
    name = models.CharField(blank = False, max_length = 100) 
    surname = models.CharField(blank = False, max_length = 100) 
    email = models.EmailField(blank = False, max_length = 200, unique = True) 
    guest_password = models.CharField(blank = False, max_length = 50) 
    repeat_guest_password = models.CharField(blank = False, max_length = 50) 
    slug = models.SlugField(unique = True) 
    profile_picture = models.ImageField(upload_to = upload_location, 
             null = True, 
             blank = True, 
             width_field="width_field", 
             height_field="height_field" 
             ) 
    width_field = models.IntegerField(default = 0, null = True) 
    height_field = models.IntegerField(default=0, null = True) 
    islogged = models.BooleanField(default = False) 

    def get_absolute_url(self): 
     return reverse("gosti:restorani", kwargs={"slug": self.slug}) 

これは私のforms.pyファイルです:

class GuestForm(forms.ModelForm): 
    """ 
    Registration form 
    """ 
    class Meta: 
     model = Guest 
     fields = [ 
      'name', 
      'surname', 
      'email', 
      'guest_password', 
      'repeat_guest_password', 
     ] 

    #pomocu ovog dole moguce je primenjivati razlicite nacine za styling nasih polja odradjenih preko djanga 
    def __init__(self, *args, **kwargs): 
     super(GuestForm, self).__init__(*args, **kwargs) 
     self.fields['name'].widget = forms.TextInput(attrs={ 
      'placeholder': 'Name*', 
      'required': True, 
      'class': "form-first-name form-control" 
      }) 

     self.fields['surname'].widget = forms.TextInput(attrs={ 
      'placeholder': 'Surname*', 
      'required': True, 
      'class': "form-last-name form-control" 
      }) 

     self.fields['email'].widget = forms.EmailInput(attrs={ 
      'placeholder': 'Email*', 
      'required': True, 
      'class': "form-email form-control" 
      }) 

     self.fields['guest_password'].widget = forms.PasswordInput(attrs={ 
      'placeholder': 'Enter password*', 
      'required': True, 
      'class': "form-first-name form-control" 
      }) 

     self.fields['repeat_guest_password'].widget = forms.PasswordInput(attrs={ 
      'placeholder': 'Confirm password*', 
      'required': True, 
      'class': "form-first-name form-control" 
      }) 

class AuthenticationForm(forms.ModelForm): 
    """ 
    Login form 
    """ 

    class Meta: 
     model = Guest 
     fields = ['email', 'guest_password'] 

    def __init__(self, *args, **kwargs): 
     super(AuthenticationForm, self).__init__(*args, **kwargs) 
     self.fields['email'].unique = False 
     self.fields['email'].widget = forms.EmailInput(attrs={ 
      'placeholder': 'Email*', 
      'required': True, 
      'class': "form-email form-control" 
      }) 

     self.fields['guest_password'].widget = forms.PasswordInput(attrs={ 
      'placeholder': 'Password*', 
      'required': True, 
      'class': "form-first-name form-control" 
      }) 

class UpdateGuestProfileForm(forms.ModelForm): 
    """ 
    registration form 
    """ 

    class Meta: 
     model = Guest 
     fields = ['email', 'name', 'surname', 'profile_picture'] 

    def __init__(self, *args, **kwargs): 
     super(UpdateGuestProfileForm, self).__init__(*args, **kwargs) 
     self.fields['email'].widget = forms.EmailInput(attrs={ 
      'placeholder': 'Email*', 
      'required': True, 
      'class': "form-control" 
      }) 

     self.fields['name'].widget = forms.TextInput(attrs={ 
      'placeholder': 'Name*', 
      'required': True, 
      'class': "form-control" 
      }) 

     self.fields['surname'].widget = forms.TextInput(attrs={ 
      'placeholder': 'Surname*', 
      'required': True, 
      'class': "form-control" 
      }) 

、これが私のviews.pyファイルです:

def guest_registration(request): 
    form = GuestForm(request.POST or None, request.FILES or None) 
    if form.is_valid(): 
     password1 = request.POST['guest_password'] 
     password2 = request.POST['repeat_guest_password'] 
     if Guest.objects.filter(email = request.POST['email']).exists(): 
      messages.error(request, 'error', extra_tags='email_exists') 
     elif len(request.POST['guest_password']) < 6 or len(request.POST['guest_password']) > 50: 
      messages.error(request, 'error', extra_tags='password_length_error') 
     elif request.POST['guest_password'] != request.POST['repeat_guest_password']: 
      messages.error(request, 'erorr', extra_tags='passwords_dont_match_error') 
     else: 
      instance = form.save(commit = False) 
      instance.save() 
      form = GuestForm() 
      messages.success(request, 'success') 
      return redirect('/guest/login/') 

    context = { 
     "form": form, 
    } 

    return render(request, 'registrationpage.html', context) 

def guest_login(request): 
    """ 
    Login verification 
    """ 

    form = AuthenticationForm(request.POST or None) 
    if form.is_valid(): 
     #instance = form.save(commit = False) 
     if Guest.objects.filter(email = request.POST['email'], guest_password = request.POST['guest_password']).exists(): 
      guest = Guest.objects.get(email = request.POST['email'], guest_password = request.POST['guest_password']) 
      Guest.objects.select_for_update().filter(email = request.POST['email'], guest_password = request.POST['guest_password']).update(islogged = True) 
      return HttpResponseRedirect(guest.get_absolute_url()) 
     else: 
      messages.error(request, 'error', extra_tags = 'login_error') 
      form = AuthenticationForm() 

    context = { 
     "form": form, 
    } 

    return render(request, 'loginpage.html', context) 

電子メールフィールドから "unique = True"を削除すると正常に動作しますが、 "unique = True"を設定するとフォームが有効ではないことがわかりますe「guest_login」メソッド。 誰かが私を助けることができたら、私はそれを感謝します。

メールが既に存在するので何も起こりませんが、私はそのメールをデータベースに書き込もうとしていないので、ログインしてユーザー名として使用してください。

+0

コンソールからトレースバックやメッセージを受け取りますか?その場合は、ここに追加してください。 –

+0

いいえ、何もエラーは発生しません。問題は、フォームが有効かどうかをチェックするときに、常にguest_loginのメソッドでFalseです。 その行:もしform.is_valid()がFalseならば、彼はそのif文の本文には絶対に入りません。そして、なぜ私はわかりません – P3P5

答えて

0

この作品があります。コードを次のように変更してください:

def guest_login(request): 
    """ 
    Login verification 
    """ 
    if request.method == "POST": 
     form = AuthenticationForm(request.POST or None) 
     if form.is_valid(): 
      ... 
     else: 
      messages.error(request, 'error', extra_tags = 'login_error') 
    else: 
     form = AuthenticationForm() 

    context = { 
     "form": form, 
    } 

    return render(request, 'loginpage.html', context) 

幸運。

+0

いいえ、動作しませんでした。問題は、電子メールアドレスを入力すると、存在するかどうかをチェックし、フォームが有効でないことを返すということです。そして、models.pyのemailフィールドから一意なものを削除するとうまくいきますが、電子メールフィールドが一意であることが必要です。 ありがとうございます。 – P3P5

関連する問題